我对 C 套接字编程还是新手,但我能够创建一些简单的客户端和服务器程序。
我正在编写一个监听 TCP 连接的服务器,它的职责是响应客户端的请求,然后在客户端发送特殊的字节序列时(当然,或者当它断开连接时)关闭通信。
我开始使用以下代码对服务器进行编码accept()
无限循环中的函数:服务器等待客户端,accept() 执行所有操作,close() 最后返回套接字描述符,然后再次返回等待接受新客户端。
由于我想一次为一个客户端提供服务,因此我以这种方式调用监听函数:listen(mysocket, 1);
一切都进行得很顺利,但是新的问题又出现了。上面解释的服务器部分在一个单独的线程(我们称之为线程#2)中运行,并且主线程(线程#1)必须能够告诉它终止。然后我创建了一个全局变量,如果该变量设置为 1(由线程 #1),则线程 #2 必须终止。问题是当线程 #2 被卡住时accept()
函数被调用,因此它不能定期检查全局变量。
我显然需要该函数的超时值:“如果没有要接受的连接,请检查全局变量的值,如果设置为 0,则继续等待新连接;如果设置为 1,则终止”。
然后我用谷歌搜索了一个解决方案,发现select()
函数做我需要的事情。虽然有点不一样,我还是第一次发现fd_set
以及所有 FD_* 宏。我修改了服务器部分以使其与select()
功能和一切都很好,但最后一个问题来了,我无法解决。
如果这样调用listen函数:listen(socket, 1);
但服务器仍然同时接受和服务多个连接。这是否取决于select()
与 fd_set 一起使用吗?我正在使用在网络上找到的一些示例,当接受连接时,它会创建一个新的套接字描述符,该描述符与所有其他套接字一起放入集合中。
我只想接受一个客户端的连接,我编写了一个简单的代码来识别是否应该为连接的客户端提供服务,但是有没有办法在服务器端断开连接?我知道我必须使用close()
函数关闭套接字描述符,但是当使用select()
我正在使用 fd_set,但我真的不知道如何关闭它们。
或者,有没有办法限制集合中套接字描述符的数量?我找到了 FD_SETSIZE 宏,但我无法让它工作,我什至不确定它是否解决了问题。
感谢您的时间!
The listen()
函数有一个backlog
确定在发送之前有多少传入请求可能处于待处理状态的参数may被拒之门外。措辞谨慎,以便操作系统实现可以支持more比你在listen()
称呼。您可能无法控制积压连接的确切数量。
如果您必须一次仅支持一个客户端,则接受第二个连接,但告诉新客户端该连接此时不可用,然后关闭新连接。这样做的好处还在于您有机会告诉客户端连接不可用的原因。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)