2011-06-21 11 views
1

を書き換えるためにどのように私は私が窓(WinSocks 2.2)に移植していると私は(だけではなく)poll()のMSの実装に問題を抱えているいくつかのPOSIXCコードをしました。WSAPoll fdが::必要性の提案をそれに

私はPOSIX socketsといくつかの経験を持っているが、私はWinsock2のに非常に新しいです、私はMSDN上の任意の有用なリードを発見していないので、私はここに尋ねる:「でこのサンプルコードと同等の動作をするためにどのように窓?

static int connect_to_addr(char *address, char *port) 
{ 
    struct addrinfo hints; 
    struct addrinfo *addr; 
    int fd; 
    memset(&hints, 0, sizeof(hints)); 
    hints.ai_family = PF_UNSPEC; 
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_flags = AI_NUMERICHOST; 

    if (getaddrinfo(address, port, &hints, &addr) != 0) return -1; 

    fd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol); 
    if (fd < 0) return -1; 

    if (connect(fd, addr->ai_addr, addr->ai_addrlen) < 0) return -1; 

    freeaddrinfo(addr); 
    return fd; 
} 

機能connect_to_addr()だけのように見える2番目のフィールドに何fdデモのためです。

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); 
     ... 
    } 
} 

この共通イディオムをWinSockで実装する方法は?提案ありがとう。

さらに、WSAPoll()はVista以降、ws2_32.dllにあります。それはXPの下で動作させる方法は?

+0

[This](http://tangentsoft.net/wskfaq/)が役立つかもしれません。 –

答えて

0

stdin/sockを待つためにWaitForMultipleObjects()を使用する方がよいです。

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. 
    } 
} 
関連する問題