【问题标题】:Concatenating buffer when the sending is too fast in a socket当套接字中的发送速度过快时连接缓冲区
【发布时间】:2016-12-18 06:31:18
【问题描述】:

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

【问题讨论】:

  • 不清除问题。你是说recv块吗?如果是这样,您可以在 NOWAIT 标志上设置标志并检查结果。如果对方关闭套接字,recv 也可以返回 0,你是否覆盖了这种情况?顺便说一句,将 malloc 和 free 移到你的 do/while 之外。
  • 您是否在同一个 TCP 流中发送多个文件? (坏主意,除非您在流中插入自己的“文件结尾”标记。)

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


【解决方案1】:

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

解决方案:

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

【讨论】:

    猜你喜欢
    • 2010-11-09
    • 2015-04-28
    • 2018-11-08
    • 1970-01-01
    • 2013-02-16
    • 2014-05-10
    • 2011-01-25
    • 1970-01-01
    • 2014-08-19
    相关资源
    最近更新 更多