gpt4 book ai didi

C——套接字通信(TCP)

转载 作者:行者123 更新时间:2023-11-30 19:18:37 26 4
gpt4 key购买 nike

我正在尝试通过 TCP 连接传递结构变量,但我无法理解问题所在。我得到了变量命令和 id,但是当我读取用户名变量(以及后面的变量)时,printf 没有给出任何结果。

typedef struct _msg{ // 4+4+20+20+44+200+8=300
int command;
int id;
char username[20];
char password[20];
char subject[44];
char text[200];
time_t timestamp;
} msg;




msg* get_msg(int client_socket){
char *auxString= (char*) calloc (1, sizeof(time_t));
msg *auxMsg= (msg*) calloc(1,sizeof(msg));

read(client_socket, auxString , sizeof(auxMsg->command));
auxMsg->command=strtol(auxString,NULL,10);
printf("%d\n", auxMsg->command);
read(client_socket, auxString, sizeof(auxMsg->id));
auxMsg->id=strtol(auxString,NULL,10);
printf("%d\n", auxMsg->id);

read(client_socket, auxMsg->username, sizeof(auxMsg->username));
printf("%s\n", auxMsg->username);
read(client_socket, auxMsg->password, sizeof(auxMsg->password));
printf("%s\n", auxMsg->password);
read(client_socket, auxMsg->subject, sizeof(auxMsg->subject));
printf("%s\n", auxMsg->subject);
read(client_socket, auxMsg->text, sizeof(auxMsg->text));
printf("%s\n", auxMsg->text);

read(client_socket, auxString , sizeof(auxMsg->timestamp));
auxMsg->timestamp=strtol(auxString,NULL,10);
printMsg(auxMsg);
return auxMsg;
}

int send_msg(int client_socket, int command, int id, char* username, char* password, char*subject, char*text, time_t timestamp){
char* auxString=(char*) calloc (1,sizeof(time_t));

sprintf(auxString,"%d",command);
write(client_socket,auxString,sizeof(int));
sprintf(auxString,"%d",id);
write(client_socket,auxString,sizeof(int));

write(client_socket,username,sizeof(username));
write(client_socket,password,sizeof(password));
write(client_socket,subject,sizeof(subject));
write(client_socket,text,sizeof(text));

sprintf(auxString,"%d",command);
write(client_socket, auxString, sizeof(time_t));

return SUCCESS;
}

最佳答案

您的struct似乎包含固定长度的字符串字段,但在您的send_msg函数中您只是传递指针。

因此,当您使用 sizeof 时,您只需传递指针的大小(在 32 位系统上通常为 4,在 64 位系统上通常为 8)系统)而不是字符串的长度

我强烈建议更改您的 send_msg 函数,以便它也采用 msg* 指针而不是单个字段,然后使用单独的函数来构建这样的结构来自这些领域。

完成此操作后,您的 send_msg 函数将简化为:

ssize_t send_msg(int client_socket, msg *m) {
return write(client_socket, m, sizeof(msg));
}

同样,get_msg() 将减少为:

msg *get_msg(int client_socket) {
msg *m = malloc(sizeof(msg));
if (m) {
char *p = (char *)m;
ssize_t r = 0;
size_t n = sizeof(msg);
while ((r = read(client_socket, p, n)) > 0) {
n -= r;
p += r;
}
if (r == -1) { /* an error occurred */
free(m);
m = NULL;
}
}
return m;
}

即(最多)每次调用一次readwrite,并以二进制形式传输int字段。 get_msg 函数展示了如何继续阅读,直到获得整个结构 - send_msg 函数在理想情况下也应该看起来相同。

不过,这里有一些警告您应该注意:

首先,传输的数据将始终是struct msg的完整大小,即使其中的字符串没有填充其缓冲区。更优化的协议(protocol)将传输字符串长度,然后传输字符串数据。

其次,二进制数据的格式将取决于体系结构,因此如果一端是小端,另一端是大端,则代码将无法工作。然而,后者可以通过使用 htonl() 和相关函数在传输之前将二进制字段转换为规范的“网络顺序”并使用 ntohl() 转换回来来简单地修复收据。

关于C——套接字通信(TCP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26571713/

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