我还是C socket编程的新手,但我能够创建一些简单的客户端和服务器程序.我正在编写一个侦听TCP连接的服务器,其职责是回应客户端的请求,然后在客户端发送特殊字节序列时(或当它断开连接时)关闭通信.
我开始使用accept()
无限循环内的函数对服务器进行编码:服务器等待客户端,接受()它,做所有的事情,最后关闭()的套接字描述符然后再回去等待接受一个新的客户.
因为我想一次为一个客户端服务,所以我以这种方式调用了listen函数: listen(mysocket, 1);
一切都运作良好,但随后又出现了一个新问题.上面解释的服务器部分在一个单独的线程中运行(让我们称之为线程#2),主线程(线程#1)必须能够告诉它终止.我创建了一个全局变量,如果此变量设置为1(通过线程#1),则线程#2必须终止.问题是线程#2在accept()
调用函数时卡住,因此无法定期检查全局变量.
我显然需要该函数的超时值:"如果没有要接受的连接,请检查全局变量的值,如果设置为0则继续等待新连接,如果设置为1则继续等待".
我搜索了一个解决方案然后发现该select()
函数完成了我需要的东西.虽然它有点不同,但我第一次发现了fd_set
所有的FD_*宏.我修改了服务器部分以使其与该select()
功能一起工作,一切都很好,但是这里出现了最后一个问题,即我无法解决的问题.如果以这种方式调用listen函数:listen(socket, 1);
但服务器仍然同时接受并提供多个连接.这是否依赖,因为select()
使用fd_set?我正在使用我在Web上找到的一些示例,当接受连接时,它会创建一个新的套接字描述符,该描述符与所有其他的一起进入集合.我想接受只有一个客户端的连接,我写了一个简单的代码来识别是否应该提供连接客户端,但是有没有办法断开服务器端的连接?我知道我必须使用该close()
函数来关闭套接字描述符,但在使用时select()
我正在使用fd_set,而我真的不知道如何关闭它们.或者,有没有办法限制集合中套接字描述符的数量?我找到了FD_SETSIZE宏,但是我无法使它工作,我甚至不确定它是否解决了这个问题.
感谢您的时间!
该listen()
函数有一个backlog
参数,用于确定在可能被拒绝之前有多少传入请求可能处于待处理状态.这是措辞谨慎,以便OS实现可以支持比您在调用中指定的更多listen()
.您可能无法控制积压连接的确切数量.
如果一次只能支持一个客户端,则接受第二个连接但是告诉新客户端此时连接不可用,然后关闭新连接.这样做的好处是,您有机会告诉客户端连接不可用的原因.
归档时间: |
|
查看次数: |
3643 次 |
最近记录: |