我有一个客户端/服务器交换消息,我试图在字符串的开头添加我发送的字符串的大小,以便服务器知道要读取多少字节。 我从char *的+4 pos开始添加消息,并使用memcpy复制字符串的strlen。它似乎没有工作,有些东西告诉我这是错误的方法。这是我的代码。
//*CLIENT*//
send_message = malloc(1024 * sizeof(char));
strcpy(send_message + 4,"GETFILES ");
strcat(send_message,"/");
strcat(send_message,directory_name);
size = strlen(send_message) + 1;
csize = malloc(4 * sizeof(char));
csize = (char*)&size;
memcpy(&send_message,csize,4);
if((sent = send(sock, send_message, strlen(send_message) + 1, 0)) < 0)
perror("write");
//*SERVER*//
while(1){
count = recv(events[i].data.fd, buf, sizeof(buf),0);
if(count == -1){
//if errno = EAGAIN we have read all data. going back to main loop
if(errno != EAGAIN){
perror("read");
done = 1;
}
break;
}
else if(count == 0){
//End of file. The remote has closed the connections
done = 1;
break;
}
printf("received message %s and count %d\n", buf, count);
}
如果我评论这些行
csize = malloc(4 * sizeof(char));
csize = (char*)&size;
memcpy(send_message,csize,4);
我得到了这个输出:
received message ▒�w�GETFILES /test and count 19
否则我没有输出..任何想法如何修复它并添加标题,以便我的服务器事先知道要读取多少字节?
答案 0 :(得分:1)
已经评论过,主要问题是使用strlen(),但还有一些错误。
首先,strlen()
和其他str函数可以这种方式使用。
strcpy(send_message + 4,"GETFILES ");
strcat(send_message + 4,"/");
strcat(send_message + 4,directory_name);
size = strlen(send_message + 4) + 1;
这不是修复它的好方法,但更容易理解为什么代码无效。
这是不必要的
csize = malloc(4 * sizeof(char));
csize = (char*)&size;
memcpy(&send_message,csize,4);
你可以这么做
memcpy(send_message,&size,4);
但是,为了良好的练习和便携性,请替换4
的所有魔法sizeof(int32_t)
。
send_message
是一个数组,所以你不需要得到它的地址(&amp; send_message),它可能会这样工作,但如果它是一个指针而不是一个数组,它会破坏你的代码。 / p>
最后,你正在打印整个buff,但是你忘记了你有一个4字节的标题,这是你正确初始化csize
时不打印任何内容的主要原因。
如果您尝试这样做
printf("received message %s and count %d\n", buf+4, count);
它可能会奏效,但这并不意味着它是正确的。
编辑:我不会更新我的答案,不要让它变得更大,更难以发现你的错误,但请考虑下面的@thuovila评论并寻找有关htonl
ntohl
的更多信息以及如何使用它们。