Winsock2:select() 函数给出 "invalid arguement error"(错误 10022)?
Winsock2: select() function giving "invalid arguement error" (Error 10022)?
运行 select() 函数(提供代码的第 13 行)returns 错误 10022 (WSAEINVAL) 意味着我的超时变量为负或所有 3 个其他变量为 NULL .但是我只在第一次通过外部循环迭代后得到这个错误。
基本上我的设置是在基础发送一个 window 大小为 N 的数据包,然后通过检查我的套接字是否已准备好读取来检查是否已将任何确认发回给我。对于第一个 window 数据包, select() 调用工作正常,返回 1。但是在完整循环的第一次迭代后对 select() 的所有调用都会导致错误代码。我完全没有想法。
我看到一个线程说只需用另一个函数调用包装函数,它似乎并没有改变问题。我不知道为什么它会在第一个循环中工作,但之后就完全不工作了。
int Exit = 0;
int endRecv = 0;
int ready = 0;
//Sending Algorithm
int base = 0;
uint32_t confirmedPosition;
while (Exit == 0) {
//Send data in an N sized Window.
for (int i = 0; i < N; i++) {
if (successfulPackets[i + base] != 1) {
memcpy(&buffer_tx, &packets[i + base], BUFFERS_LEN);
sendto(socketS, buffer_tx, BUFFERS_LEN, 0, (sockaddr*)& addrDest, sizeof(addrDest));
}
}
endRecv = 0;
//Receive Confirmations
while (endRecv == 0) {
//Poll to see if something is waiting
ready = select(NULL, &readfds, NULL, NULL, &pollTime);
if (ready == -1) {
printf("Error with Code: %d", WSAGetLastError());
} else if (ready == 1) {//If yes, log confirmation
recvfrom(socketS, buffer_rx, BUFFERS_LEN, 0, (sockaddr *)&from, &fromlen);
memcpy(&confirmedPosition, &buffer_rx, 4);
successfulPackets[confirmedPosition] = 1;
fileSize -= BUFFERS_LEN - 8;
} else {//If no, end receiving and send
endRecv = 1;
}
}
//Apply Changes to Base
for (int i = 0; i < N; i++) {
if (successfulPackets[base] == 1) {
base++;
}
}
if (fileSize <= 0) {
Exit = 1;
}
}
当select returns 0时结构体readfds的内容也被设置为零(select修改它以指示哪个套接字就绪)。
当再次执行外层循环时,readfds结构中没有任何要检查的套接字,从而导致错误。您应该在 readfds 中重新设置套接字。
运行 select() 函数(提供代码的第 13 行)returns 错误 10022 (WSAEINVAL) 意味着我的超时变量为负或所有 3 个其他变量为 NULL .但是我只在第一次通过外部循环迭代后得到这个错误。
基本上我的设置是在基础发送一个 window 大小为 N 的数据包,然后通过检查我的套接字是否已准备好读取来检查是否已将任何确认发回给我。对于第一个 window 数据包, select() 调用工作正常,返回 1。但是在完整循环的第一次迭代后对 select() 的所有调用都会导致错误代码。我完全没有想法。
我看到一个线程说只需用另一个函数调用包装函数,它似乎并没有改变问题。我不知道为什么它会在第一个循环中工作,但之后就完全不工作了。
int Exit = 0;
int endRecv = 0;
int ready = 0;
//Sending Algorithm
int base = 0;
uint32_t confirmedPosition;
while (Exit == 0) {
//Send data in an N sized Window.
for (int i = 0; i < N; i++) {
if (successfulPackets[i + base] != 1) {
memcpy(&buffer_tx, &packets[i + base], BUFFERS_LEN);
sendto(socketS, buffer_tx, BUFFERS_LEN, 0, (sockaddr*)& addrDest, sizeof(addrDest));
}
}
endRecv = 0;
//Receive Confirmations
while (endRecv == 0) {
//Poll to see if something is waiting
ready = select(NULL, &readfds, NULL, NULL, &pollTime);
if (ready == -1) {
printf("Error with Code: %d", WSAGetLastError());
} else if (ready == 1) {//If yes, log confirmation
recvfrom(socketS, buffer_rx, BUFFERS_LEN, 0, (sockaddr *)&from, &fromlen);
memcpy(&confirmedPosition, &buffer_rx, 4);
successfulPackets[confirmedPosition] = 1;
fileSize -= BUFFERS_LEN - 8;
} else {//If no, end receiving and send
endRecv = 1;
}
}
//Apply Changes to Base
for (int i = 0; i < N; i++) {
if (successfulPackets[base] == 1) {
base++;
}
}
if (fileSize <= 0) {
Exit = 1;
}
}
当select returns 0时结构体readfds的内容也被设置为零(select修改它以指示哪个套接字就绪)。
当再次执行外层循环时,readfds结构中没有任何要检查的套接字,从而导致错误。您应该在 readfds 中重新设置套接字。