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

标签 c++ sockets visual-c++ visual-studio-2008 winsock2

我有一个套接字服务器,每 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 不会返回 -1 以停止接收并保存文件以开始新的接收。 我是否忘记了套接字中的一些配置——默认情况下它是异步和非阻塞的——我应该继续使用这种方式吗? 提前谢谢你

最佳答案

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

解决方案:

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

关于c++ - 当套接字中发送速度太快时连接缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38897700/

相关文章:

java - java TCP套接字关闭和重新打开中的问题

c++ - 强制卸载进程的模块

c++ - 如何从双端队列中删除随机元素

c++ - Boost MultiIndex - 对象或指针(以及如何使用它们?)?

c++ - 使用未分配的内存没有错误?

c++ - 使用模板参数定义 Hana 结构

javascript - 在浏览器中通过 JavaScript 的 UDP 套接字

python从 friend 那里接收数据

c++ - 虽然循环不退出,即使它应该

c++ - 模板类链接时错误