gpt4 book ai didi

c - poll 函数在 POLLOUT 上始终返回零

转载 作者:行者123 更新时间:2023-11-30 17:12:45 24 4
gpt4 key购买 nike

我正在编写一个线程,需要处理 5 个不同的 TCP 端口(读和写)。为此,我创建了 5 个这样的套接字(只有 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 函数告诉我套接字已准备好发送。这种情况永远不会发生,并且 poll 总是发送 POLLOUT 零???

有人知道我应该做什么吗?预先感谢您。

最佳答案

由于相关套接字是 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");
}

关于c - poll 函数在 POLLOUT 上始终返回零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31296176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com