当套接字中发送速度太快时连接缓冲区

Concatenating buffer when the sending is too fast in a socket

我有一个套接字服务器每 500 毫秒接收 XML 个文件,有时将多个文件连接为一个文件时出错。

do
{
    char* buf = (char*)MALLOCZ(IP_BUF_SZ);
    chrs_read = recv(sockfd, buf, IP_BUF_SZ, 0);

    if (chrs_read > 0)
        sBuffer.append(buf, chrs_read);

    FREE(buf);
    buf = NULL;
}
while (chrs_read > 0);

所以,有时 chrs_read 不 return 我 -1 停止接收并保存文件以开始新的接收。 我是否忘记了套接字中的一些配置——默认情况下它是异步和非阻塞的——我应该继续使用这种方式吗? 提前谢谢你

问题是所有文件都通过同一个连接发送,它们之间没有分隔符。当文件经常发送,网络有一定的延迟时,你无法知道一个文件在哪里结束,一个新文件从哪里开始。

解决方案:

  • 在文件之间插入一个分隔符,这样您就可以在收到分隔符时关闭文件,然后打开一个新文件。请注意,定界符可以在 buf 内的任何位置接收,或者如果定界符长于一个字节,它甚至可以在一次 recv 调用中部分接收,其余部分在下一个 recv呼唤。
  • 在发送端,发送文件后关闭连接,为新文件打开一个新的连接。