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