gpt4 book ai didi

c - C 语言的服务器/客户端程序 : how to send correctly dimension of structure elements via socket?

转载 作者:行者123 更新时间:2023-11-30 17:50:39 25 4
gpt4 key购买 nike

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

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

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

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

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

服务器功能浏览 BACKLOG 结构以检查哪些结构被占用。在此过程中,函数应该向客户端发送以下信息:1)每个客户端用户名的维度; 2) 每个客户的用户名。不幸的是,我似乎在计算尺寸方面遇到了一些麻烦,导致players[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 个字符长的用户名):

name dimension: 16777216 username: a

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

最佳答案

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

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

struct giocatori {  
char username[20]; //some random value for array length
int userthread;
};

关于c - C 语言的服务器/客户端程序 : how to send correctly dimension of structure elements via socket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17119010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com