我有一个套接字服务器,每 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/