向字符串添加标头并使用TCP套接字发送它

时间:2013-05-23 17:46:17

标签: c sockets tcpclient

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

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

1 个答案:

答案 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的更多信息以及如何使用它们。