- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个线程,需要处理 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/
我正在编写一个线程,需要处理 5 个不同的 TCP 端口(读和写)。为此,我创建了 5 个这样的套接字(只有 PORT 不同): sock_tcp = socket(AF_INET, SOCK_STR
从 Linux 文档中,POLLOUT 表示可以无阻塞地写入正常数据。好吧,但是这个解释是模棱两可的。poll 报告此事件后,可以在不阻塞的情况下写入多少数据? 1字节? 2个字节?技嘉?在阻塞套接字
我正在尝试使用套接字编写端口打开测试,出于某种原因,这会报告无效 IP 地址的“端口打开”。我目前连接到一个未连接到 Internet 的接入点,因此这错误地报告了为外部 IP 地址打开的端口。 首先
我在单个 fd 上使用 poll() 在 c 中建立了客户端和服务器之间的连接。我希望客户端在服务器有东西要发送时收到一条消息,反之亦然。 据我所知,poll() 监听文件描述符上的事件。我不清楚这些
我是一名优秀的程序员,十分优秀!