WSAPoll по имени fd :: Нужны предложения, как его переписать - PullRequest
1 голос
/ 21 июня 2011

У меня есть некоторый POSIXC код, который я портирую на windows (WinSocks 2.2), и у меня возникают проблемы с реализацией MS (не только) poll().

У меня есть некоторый опыт работы с POSIX sockets, но я довольно новичок в WinSock2, я не нашел никаких полезных ссылок на MSDN, поэтому я спрашиваю здесь: "Как сделатьповедение, эквивалентное этому примеру кода в Windows? "

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() предназначена только для демонстрации того, как выглядит 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);
        ...
    }
}

Как реализовать эту распространенную идиому под WinSocks?Спасибо за предложения.

Еще лучше, WSAPoll () находится в ws2_32.dll начиная с Vista;как заставить работать под XP?

1 Ответ

0 голосов
/ 21 июня 2011

Вам лучше использовать 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.
    }
}
...