小编Jac*_*ack的帖子

C - 使用select()时如何限制服务器中的入站连接数

我还是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宏,但是我无法使它工作,我甚至不确定它是否解决了这个问题.

感谢您的时间!

c sockets tcp

2
推荐指数
1
解决办法
3643
查看次数

标签 统计

c ×1

sockets ×1

tcp ×1