C 名为fd::的WSAPoll需要如何重写它的建议吗

C 名为fd::的WSAPoll需要如何重写它的建议吗,c,sockets,posix,winsock,winsock2,C,Sockets,Posix,Winsock,Winsock2,我有一些正在移植到windows(WinSocks 2.2)的POSIXC代码,我在MS实现(不仅仅是)poll()时遇到了问题 我对POSIXsockets有一些经验,但我对WinSock2还很陌生,我还没有找到任何关于MSDN的有用线索,所以我在这里问:“如何在windows上实现与此示例代码相同的行为?” 如何在WinSocks下实现这个常见的习惯用法?谢谢你的建议 更好的是,WSAPoll()自Vista以来就在ws2_32.dll中;如何使其在XP下工作?您最好使用WaitForMul

我有一些正在移植到windows(WinSocks 2.2)的POSIX
C
代码,我在MS实现(不仅仅是)
poll()
时遇到了问题

我对POSIX
sockets
有一些经验,但我对WinSock2还很陌生,我还没有找到任何关于MSDN的有用线索,所以我在这里问:“如何在windows上实现与此示例代码相同的行为?”

如何在WinSocks下实现这个常见的习惯用法?谢谢你的建议


更好的是,WSAPoll()自Vista以来就在ws2_32.dll中;如何使其在XP下工作?

您最好使用WaitForMultipleObjects()来等待stdin/sock

HANDLE h[2];
h[0] = GetStdHandle(STD_INPUT_HANDLE);
h[1] = sock;

while (1) {
    DWORD ret;
    ret = WaitForMultipleObjects(2, h, FALSE, 0 /* wait value you want */);

    if (ret == WAIT_OBJECT_0) {
        // munipulating stdin.
    }
    if (ret == WAIT_OBJECT_0 + 1) {
        // munipulating sock.
        // then call recv.
    }
}
可能会有帮助。
WSAStartup(...)
...
pollfd cinfd[2];
fds[0].fd = _fileno(stdin); //THIS is probably not supported on win32 
fds[0].events = POLLIN;
fds[1].fd = f_connect(some_addr, some_port); //OK
fds[1].events = POLLIN;

while (1) {
    res = WSAPoll(fds, 2, -1); //returns 1

    if (fds[0].revents & (POLLIN | POLLHUP)) { //fds[0].revents == POLLNVAL  !! problem
        char buf[1024];
        int n, w, i;
        n = read(fds[0].fd, buf, 1024);
        ...
    }

    if (fds[1].revents & POLLIN) {
        char buf[1024];
        int n, w, i;
        n = recv(fds[1].fd, buf, 1024, 0);
        ...
    }
}
HANDLE h[2];
h[0] = GetStdHandle(STD_INPUT_HANDLE);
h[1] = sock;

while (1) {
    DWORD ret;
    ret = WaitForMultipleObjects(2, h, FALSE, 0 /* wait value you want */);

    if (ret == WAIT_OBJECT_0) {
        // munipulating stdin.
    }
    if (ret == WAIT_OBJECT_0 + 1) {
        // munipulating sock.
        // then call recv.
    }
}