首页 > 解决方案 > 如何正确连接部分接收的字符串?

问题描述

我在 C 中使用套接字,我有一个将发送消息的客户端和消息的大小以及将在较短大小的缓冲区中接收此消息的服务器。消息正在正确发送,但是当我尝试将所有缓冲区连接到一个字符串中时遇到问题。

客户端:

char *buffer = "Hello from the client you're receiving this message";
int bytes_sent;
long msgSize = strlen(buffer);
printf("Buffer Size: %ld\n", msgSize);
int msgFileSize = send(SocketFD, &msgSize, sizeof(msgSize),0);
bytes_sent = send(SocketFD, buffer, strlen(buffer), 0);

服务器:

char buffer[8];
ssize_t recsize;
long msgSize;
int msize = recv(ConnectFD, &msgSize, sizeof(msgSize), 0);
int total_byt = 0;
printf("Full Message Size: %ld\n", msgSize);
char full_msg[msgSize];

while (total_byt < msgSize) {
  recsize = recv(ConnectFD, (void*)buffer, sizeof buffer, 0);
  total_byt += recsize;
  strcat(full_msg, buffer);
  if (recsize < 0) {
    fprintf(stderr, "%s\n", strerror(errno));
    exit(EXIT_FAILURE);
  }
  printf("recsize: %d\n ", (int)recsize);
  sleep(1);
  printf("datagram: %.*s\n", (int)recsize, buffer);
}

printf("full message: %s\n", full_msg);

服务器的输出如下所示:

Full Message Size: 51
recsize: 8
 datagram: Hello fr
recsize: 8
 datagram: om the c
recsize: 8
 datagram: lient yo
recsize: 8
 datagram: u're rec
recsize: 8
 datagram: eiving t
recsize: 8
 datagram: his mess
recsize: 3
 datagram: age
full message: ��9�Hello from the client you're receiving this message mess

标签: csockets

解决方案


这里的问题很少。

  1. strlen返回不包括null字符的长度。

    long msgSize = strlen(buffer);
    

    因此,您需要有 1 个额外的地方来存放nullchar。

    char full_msg[msgSize+1];
    full_msg[0] = '\0';
    
  2. strcatasbuffernull终止存在未定义的行为。

    recsize = recv(ConnectFD, (void*)buffer, sizeof buffer, 0);
    strcat(full_msg, buffer);
    

    采用

    strncpy(full_msg, buffer, sizeof buffer);
    
  3. 最后null确定后终止full_msg循环。

    while (total_byt < msgSize) {
    ….
    }
    full_msg[total_byt] = '\0';
    

推荐阅读