gpt4 book ai didi

c - poll/select 和 writefds 的最佳实践

转载 作者:行者123 更新时间:2023-12-03 02:45:46 25 4
gpt4 key购买 nike

select()poll() 的大多数示例的工作方式与此类似:

int activity = select(FD_SETSIZE, &readfds , NULL , NULL , NULL);
//...
for (i = 0; i < max_clients; i++){
int sd = client_socket[i];
if (FD_ISSET(sd , &readfds)){
int len = read(sd , buffer, 1024);
if (len == 0){
// disconnect
}
// echo server, send the data back
send(sd , buffer , len , 0 );
}
}

我在这段代码中看到的问题是 - 为什么我们认为/期望这个 send() 调用不会阻塞?

即使我们将套接字设置为非阻塞,那么 send() 也不会阻塞,而是会发送部分数据,甚至不发送任何数据。

可能我错了,但我认为我需要有字符串数组并使用writefds直到发送数据等。

这方面有什么好的例子/实践吗?

最佳答案

您担心 send() 会阻塞是对的,因为它确实可以阻塞。

通常的解决方案是将套接字模式设置为非阻塞。然后,每次调用 send() 时,检查是否:

  1. 并非所有数据均已发送;或
  2. errno 查看它是 EGAIN 还是 EWOULDBLOCK

如果发生其中任何一种情况,则系统的套接字缓冲区已满,您需要在“等待”内核发送一些数据并释放系统套接字缓冲区中的空间之前将数据存储在某个地方。

现在,您可以将套接字添加到传递给 select()writefds 数组中,以要求系统在套接字再次变得可写时通知您。当 select() 返回此套接字时,您应该尝试再次发送数据。如果在此期间有任何额外的数据排队,请尝试发送该数据。如果您可以发送所有数据,请从 writefds 数组中删除套接字(否则每次调用 select() 时都会返回该套接字)。

关于c - poll/select 和 writefds 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27147205/

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