轮询函数在POLLOUT

时间:2015-07-08 14:49:09

标签: c sockets

我正在编写一个需要处理5个不同TCP端口(读写)的线程。 为此我创建了5个这样的sockects(只有PORT不同):

sock_tcp = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, IPPROTO_TCP);

/* Allow socket to reuse address */
sockopt = 1;
setsockopt(sock_tcp, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof(sockopt));

/* bind socket to an address */
memset(&addr_tcp, 0, sizeof(addr_tcp));
addr_tcp.sin_family = AF_INET; /* Address family */
addr_tcp.sin_port = htons(10001); /* Port number */
addr_tcp.sin_addr.s_addr = htonl(INADDR_ANY); /* IPv4 address */
if (bind(sock_tcp, (struct sockaddr *) &addr_tcp, sizeof(addr_tcp))) {
        pr_err("tcp socket failed");
    }

在线程中我填充pollfd数组并使用poll函数:

/* Create array for poll function */
for (i = 0; i < 5; i++) {
    /* Set socket in passive mode */
    listen(sock[i].sockfd, 1);
    /* Set socket initial only in receiving mode with events 
       which will trigger the socket */
    pfd[i].events = POLLIN | POLLPRI | POLLOUT;
    /* Add socket in a structuret */
    pfd[i].fd = sock[i].sockfd;
}

稍后在代码中写道:

ret = poll(pfd, 5, 0);

有了这个,我能够从所有5个套接字接收数据,并且它正在工作。如果套接字接收数据,则返回函数。 我尝试发送数据时出现问题。 我尝试添加事件POLLOUT并等待poll函数给我套接字已准备好发送。这种情况永远不会发生,并且轮询总是发送为POLLOUT零???

有人知道我该怎么办? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

由于所讨论的套接字是TCP侦听套接字,因此它们永远不会为写入做好准备。您只能从其中一个套接字accept()中获取,这将为您返回一个接受连接的新套接字。

此外,您还没有正确设置非阻塞套接字。假设Linux,它完成如下:

int flag;
if ((flag = fcntl(sock_tcp, F_GETFL)) == -1) {
    perror("Error getting socket descriptor flags");
}
flag |= O_NONBLOCK;
if (fcntl(sock_tcp, F_SETFL, fdflag) == -1) {
    perror("Error setting non-blocking option");
}