c - 如何防止程序被socket listen()阻塞

标签 c sockets

我正在写一个服务器程序,在初始化时,我想在某个ip/portbind()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/

相关文章:

c - 限制客户端连接

java - Android - 如何在服务重新启动时保留套接字连接

c - 在读取未知行长度的文件时确定 EOF

c - 使用 readdir 列出问题

检查具有空数据的节点

python - 通过套接字以字节形式发送图像

c - 需要图路径抽象算法

c - "undefined reference"C编译静态库错误

linux - 我怎样才能避免僵尸进程

java - 只需在 Java 中打开一个端口