大侠们,救急啊~~unix下设置socket阻塞问题

大侠们,救急啊~~unix下设置socket阻塞问题,第1张

在写服务器程序,比较常见的一个问题是,当socket 连上来以后,它可能继没有数据发送也没有接受。

那么这个连接就会挂在那里。 假设这样的链接是恶意的, 那么他会大量消耗你的资源。

所以我希望进行一次WSARecv 投递以后, 能在一定时间内超时, 那么我就可以根据情况进行处理了。

len = 10 * 1000

Ret = setsockopt(Accept, SOL_SOCKET, SO_RCVTIMEO , &len , sizeof(len))

printf("Ret %d %d\n", Ret, WSAGetLastError())

代码很简单, 在accept 以后, 设置socket 的recv 超时, 如果不使用iocp, 就使用见得的recv 肯定

能在超时以后,获得一个结果。

但是在iocp的例子里面,我发现超时以后,无法GetQueuedCompletionStatus 获得消息,那么这样我就很被动了

现在我起了线程定时扫描所有的socket ,效率很低,希望能解决这个问题。

我建议 阅读 《unix网络编程》里面有很详细的解释

举个例子:

你可以把socket的IO *** 作看做是等人

阻塞:

你站在和人越好的地方等人,你们的约定了一个时间,当你等的时间超过了这个时间后你就可以离开这个地点去干其他的事情,否则你将继续在这里等人。而INFINIT就是无限等待下去

非阻塞:

就是你不需要站在越好的地点等人,你可以作在离这个地点很近的一个咖啡厅喝茶听音乐,但你能够看到这个约定地点的情况,一旦有人来你就可以走过去和那个人见面

阻塞:人来了以后你可以第一时间见到,而不用别人等你

非阻塞:和你正在做的事情有关,如果你在坐在咖啡厅看电视,就很有可能造成别人等你的情况了


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11366963.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存