Winsock2:select()函数给出“无效的争论错误”(错误10022)?

时间:2019-05-29 11:28:32

标签: c++ winsock winsock2

运行select()函数(提供的代码的第13行)返回错误10022(WSAEINVAL),这意味着我的超时变量为负或其他3个变量均为NULL。但是我只有在通过外部循环进行第一次迭代后才会收到此错误。

基本上,我的设置是在底部发送一个大小为N的数据包窗口,然后通过检查我的套接字是否准备好读取来检查是否有任何确认已发回给我。对于数据包的第一个窗口,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;
    }
}

1 个答案:

答案 0 :(得分:1)

当select返回0时,结构readfds的内容也设置为零(select对其进行修改以指示哪个套接字已准备就绪)。

当外部循环再次执行时,readfds结构不包含任何要检查的套接字,这将导致错误。您应该在readfds中再次设置套接字。