Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C-Socket中侦听连接的最佳方法_C_Sockets - Fatal编程技术网

在C-Socket中侦听连接的最佳方法

在C-Socket中侦听连接的最佳方法,c,sockets,C,Sockets,我有一台服务器运行良好。这个服务器是一个多客户机,工作正常,但我不认为我使用的是最好的方法,这个假设的要点是我“退出”应用程序的方式。我正在处理信号并退出,但这不对,我甚至无法使用valgrind进行调试。 在我的其他应用程序中,我使用一个全局变量来保存应用程序状态,例如,pexit,在每个“永远”运行的线程中,条件是: while (!pexit) .... 在信号手柄中,我将“pexit”设置为“true”,一切正常。但我的问题是监听函数,它是“阻塞”,因此我不能使用全局变量。有没有更好的

我有一台服务器运行良好。这个服务器是一个多客户机,工作正常,但我不认为我使用的是最好的方法,这个假设的要点是我“退出”应用程序的方式。我正在处理信号并退出,但这不对,我甚至无法使用valgrind进行调试。 在我的其他应用程序中,我使用一个全局变量来保存应用程序状态,例如,
pexit
,在每个“永远”运行的线程中,条件是:

while (!pexit) ....
在信号手柄中,我将“pexit”设置为“true”,一切正常。但我的问题是监听函数,它是“阻塞”,因此我不能使用全局变量。有没有更好的方法在不阻塞的情况下执行此操作

while ((client_sock = accept(socket_desc, (struct sockaddr *) &client, (socklen_t*) & c))) {
....

在主循环中,不要直接调用
accept()
,而是使用
select()
检查传入连接。将
socket\u desc
(“母”套接字)添加到要监视读取的文件描述符列表中,并设置适当的超时。当
select()
返回
socket\u desc
设置的位时,您可以调用
accept()
,而无需阻塞。超时可确保
select()
调用不会无限期阻塞。

accept阻塞,直到连接就绪。请查看
man getaddrinfo
以获取套接字服务器和客户端的示例答案可能取决于操作系统,您使用哪种操作系统?一般来说,我不会太担心关机时的清理,因为操作系统会清理所有东西。@alain,这是一台Linux机器。我不确定自己是否理解,但问题不在于如何或何时关闭套接字,而在于如何在不阻塞的情况下继续接受(多个客户端),因此使用我的“PaPort”停止等待并关闭我的应用程序。您可以将侦听套接字设置为非阻塞。顺便说一句,您的
((client_sock=accept(socket…
)不正确。accept()将在出现错误时返回-1,而不是零。