我正在写一个服务器程序,在初始化时,我想在某个ip/port
上bind()
和listen()
>。但是随后整个程序被 listen()
阻塞了。有没有什么方法可以让程序每隔 5 毫秒检查一次新的传入连接?
我的代码目前是这样的:
int main(){
initialize();
do_something();
return 0;
}
在initialize()
中,设置套接字:
void initialize(){
sockfd = sock_create_bind(ip_addr[nodeid], port_addr[nodeid]);
listen(sockfd, 5);
peer_sockfd = accept(sockfd, (struct sockaddr *)&peer_addr, &peer_addr_len);
}
但是 initialize()
永远不会返回,并且 do_something()
永远不会被调用。所以我想知道有没有办法防止这种阻塞?谢谢。
最佳答案
你在这里阻止
peer_sockfd = accept(sockfd, (struct sockaddr *)&peer_addr, &peer_addr_len);
为避免阻塞,您可以使用select
fd_set fds;
FD_ZERO(fds);
FD_SET(sockfd, fds);
struct timeval tv = { 0, 0 };
select(sockfd + 1, &fds, NULL, NULL, &tf);
if (FD_ISSET(socktf, fds)) {
peer_sockfd = accept(sockfd, (struct sockaddr *)&peer_addr, &peer_addr_len);
}
要确定检查的时间间隔,请编写您的代码以便在适当的时间间隔调用它。
您需要对 peer_sockfd
上的 read()
和 write()
执行类似的操作。如果您假设 sockfd
不是来自恶意主机操作系统,您可以只检查 read()
。
关于c - 如何防止程序被socket listen()阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57826616/