我还是 C 套接字编程的新手,但我能够创建一些简单的客户端和服务器程序。我正在编写一个侦听 TCP 连接的服务器,它的职责是响应客户端的请求,然后在客户端发送特殊的字节序列时(或者当它断开连接时)关闭通信。
我开始使用无限循环中的函数对服务器进行编码accept()
:服务器等待客户端,accept() 完成所有工作,close() 是最后的套接字描述符,然后再次返回等待接受一个新客户。
因为我想一次服务一个客户,所以我用这种方式调用了监听函数:listen(mysocket, 1);
一切都很顺利,但随后又出现了一个新问题。上面解释的服务器部分在一个单独的线程中运行(我们称之为线程#2),主线程(线程#1)必须能够告诉它终止。然后我创建了一个全局变量,如果这个变量设置为 1(由线程 #1),线程 #2 必须终止。问题是线程#2 在调用函数时卡住了accept()
,因此它不能定期检查全局变量。
我显然需要该函数的超时值:“如果没有要接受的连接,请检查全局变量的值,如果设置为 0,则继续等待新连接,如果设置为 1,则终止”。
然后我搜索了一个解决方案,发现该select()
功能可以满足我的需求。不过有点不同,我第一次发现了fd_set
所有的 FD_* 宏。我修改了服务器部分以使其与该select()
功能一起工作,并且一切都非常好,但这是最后一个问题,我无法解决的问题。如果以这种方式调用监听函数:listen(socket, 1);
但服务器仍然同时接受并服务多个连接。这是否取决于因为select()
与 fd_set 一起使用?我正在使用我在网上找到的一些示例,当连接被接受时,它会创建一个新的套接字描述符,该描述符与所有其他套接字描述符一起放入集合中。我只想接受一个客户端的连接,我编写了一个简单的代码来识别是否应该为连接的客户端提供服务,但是有没有办法断开它的服务器端?我知道我必须使用该close()
函数来关闭套接字描述符,但是在使用时select()
我正在使用 fd_set,我真的不知道该怎么做才能关闭它们。或者,有没有办法限制一组套接字描述符的数量?我找到了 FD_SETSIZE 宏,但我无法让它工作,我什至不确定它是否能解决问题。
感谢您的时间!