当套接字中发送速度太快时连接缓冲区
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
呼唤。
- 在发送端,发送文件后关闭连接,为新文件打开一个新的连接。
我有一个套接字服务器每 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
呼唤。 - 在发送端,发送文件后关闭连接,为新文件打开一个新的连接。