0

由于我对 C 问题缺乏了解,我觉得这一定是一个愚蠢的错误,但我无法找到解决方案。

我对 C 很陌生,我正在开发一个带有线程池的客户端/服务器程序以进行分配。我的问题是:我需要使每个客户端都可以通过键入发送到服务器的命令来查看连接到服务器的所有客户端。为此,在服务器中,我必须使用一个全局结构来保存所有参与者的用户名和线程索引(此结构的使用是分配规范的一部分)。

这就是我定义结构的方式(BACKLOG 是线程池的维度,也是一次可以连接的最大客户端数):

struct giocatori {
char* username;
int userthread;
};
struct giocatori players[BACKLOG];

当客户端键入正确的命令时,命令被发送到调用检查谁连接的函数的服务器。这个功能的一部分给我带来了一些麻烦。

服务器函数浏览 BACKLOG 结构以检查哪些已被占用。在执行此操作时,该函数应向客户端发送以下内容:1)每个客户端的用户名维度;2)每个客户的用户名。不幸的是,我似乎在计算维度时遇到了一些麻烦,导致 player[i].username 上的函数 strlen() 返回了一个非常高的数字(我无法理解其来源)并且第二次发送失败(它返回一个与 username_dim 不同的数字,但仍然不是正确的数字)。这是代码的一部分:

for(i=0; i<BACKLOG; i++) {
    if(players[i].username!="\0") {
        name=players[i].username;
        username_dim=htonl(strlen(name));
        printf("name dimension: %d\n", username_dim);
        printf("username: %s\n", name);
        ret = send(sd, &username_dim, sizeof(username_dim), 0);
        if(ret == -1 || ret < sizeof(username_dim)){ 
            close(sd);
                errore("error when sending username (dimension)");              
        }
        ret = send(sd, name, username_dim, 0);
        if(ret == -1 || ret <username_dim){ 
            printf("ret %d\n", ret);
            close(sd);
                errore("errore when sending usernam (name)");               
        }
    }
}//end for

strlen() 的使用是错误的吗?如果是这样,我该怎么做才能计算我必须发送的每个用户名的长度?

先感谢您。

我忘了提,2 printf 的输出是(例如,使用 1 个字符长的用户名):

名称维度:16777216 用户名:a

我尝试了不同的用户名,维度的输出总是用户名中的字符数乘以16777216

4

1 回答 1

0

因此,您需要先为用户名分配内存,然后再为其分配任何值。尝试在您的线程中使用 malloc 甚至更简单的方法 - 替换您的结构

struct giocatori {  
  char* username;  
  int userthread;  
};

struct giocatori {  
  char username[20];  //some random value for array length  
  int userthread;  
};
于 2013-06-15T00:41:40.050 回答