C 名为fd::的WSAPoll需要如何重写它的建议吗
我有一些正在移植到windows(WinSocks 2.2)的POSIXC 名为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
C
代码,我在MS实现(不仅仅是)poll()
时遇到了问题
我对POSIXsockets
有一些经验,但我对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.
}
}