0

我有一个交换消息的客户端/服务器,我试图在字符串的开头添加我发送的字符串的大小,以便服务器知道要读取多少字节。我从 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

否则我没有输出..任何想法如何修复它并添加标题以便我的服务器提前知道要读取多少字节?

4

1 回答 1

1

如前所述,主要问题是 strlen() 的使用,但还有一些错误。

首先,strlen()可以以这种方式使用 the 和其他 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);

但是,为了良好的实践和可移植性,请将您所有的魔法替换4sizeof(int32_t).

send_message是一个数组,所以你不需要获取它的地址(&send_message),它可能会以这种方式工作,但如果它是一个指针而不是一个数组,它会破坏你的代码。

最后,您正在打印整个 buff,但您忘记了您有一个 4 字节的标头,这就是如果您正确初始化csize.

如果你尝试这样做

printf("received message %s and count %d\n", buf+4, count);

它可能会起作用,但这并不意味着它是正确的。

编辑:我不会更新我的答案,以免让您看到自己的错误变得更大更难,但请考虑下面的@thuovila 评论,并查找有关htonl ntohl以及如何使用它们的更多信息。

于 2013-05-23T18:21:47.927 回答