【发布时间】:2016-08-10 17:32:19
【问题描述】:
我正在使用 WinSock2,我想一次接收我所有的包(它们是 XML 文件)。 现在我正在制作如下,因为 setsockopt 似乎忽略了我的“命令”来设置接收缓冲区的大小,但它总是从执行中返回 OK:
#define IP_BUF_SZ 2000000
//...
std::string sBuffer;
long chrs_read = 0;
int iBufSize = IP_BUF_SZ;
//...
if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, (char*)&iBufSize, sizeof(int)) == SOCKET_ERROR)
MessageBox("Unable to increase"); //never reachs here
do
{
char* buf = (char*)MALLOCZ(IP_BUF_SZ + 1000);
chrs_read = recv(sockfd, buf, IP_BUF_SZ, 0);
if (chrs_read > 0)
sBuffer += std::string(buf);
FREE(buf);
buf = NULL;
}
while (chrs_read > 0);
但我想做这样的事情(一次全部):
setsockopt(IP_STATUS[CHAN_EPIC].sockfd, SOL_SOCKET, SO_RCVBUF, (char*)&iBufSize, sizeof(int);
char* buf = (char*)MALLOCZ(IP_BUF_SZ + 1000);
chrs_read = recv(IP_STATUS[CHAN_EPIC].sockfd, buf, IP_BUF_SZ, 0);
sBuffer += std::string(buf);
备注:我的文件小于 IP_BUF_SZ 大小。 提前谢谢你。
【问题讨论】:
-
您可以通过检查
recv函数的返回值来接收while循环中的所有数据,并期望读取直到返回值为0
标签: c++ sockets visual-c++ winsock