我正在尝试在 Windows 7 计算机上使用 C++ 中的套接字传输几块数据(每个数据块代表一幅图像)以及以下代码:int main() { std::string _ipaddress = \'...
我正在尝试在 Windows 7 计算机上使用 C++ 中的套接字传输几块数据(每个数据块代表一幅图像)以及以下代码:
int main() {
std::string _ipaddress = "192.168.0.1";
int dport = 6342;
SOCKADDR_IN dtarget;
dtarget.sin_family = AF_INET;
dtarget.sin_port = htons(dport);
dtarget.sin_addr.s_addr = inet_addr(_ipaddress.c_str());
SOCKET _data_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (connect(_data_sock, (SOCKADDR*)&dtarget, sizeof(dtarget)) == SOCKET_ERROR) {
return 1;
}
for (int i = 0; i < 100000; i++) {
fd_set read_flags, write_flags;
FD_ZERO(&read_flags);
FD_ZERO(&write_flags);
FD_SET(_data_sock, &read_flags);
struct timeval waitd;
waitd.tv_sec = 5;
int sel;
sel = select(_data_sock + 1, &read_flags, &write_flags, (fd_set*)0, &waitd);
if (FD_ISSET(_data_sock, &read_flags)) {
FD_CLR(_data_sock, &read_flags);
int readCount = 0;
int nread = 0;
int chunkSize = 8576;
char* chunkBuf = (char*)calloc(chunkSize, 1);
do {
if ((nread = recv(_data_sock, chunkBuf + readCount, chunkSize - readCount, 0)) != SOCKET_ERROR) {
readCount += nread;
};
} while (nread != 0 && readCount < chunkSize && nread != SOCKET_ERROR);
// do something with chunkBuf
}
}
return 0;
}
基本上,程序首先连接 SOCKET _data_sock
上述代码中的 , for
然后进入循环。 fd_set
在循环内声明、设置和清零 ,随后 recv()
用于接收缓冲区中的下一个数据块 chunkBuf
.
该代码对于前大约 30000 个块(它并不总是完全相同的数字,但接近 30000)运行良好,然后突然开始无法接收进一步的数据。
我寻找了可能的解释并发现文件描述符的数量是有限的,但是,我无法通过将声明拉出循环来解决问题。
有人知道如何采用代码才能接收无限数量的数据块吗?