我有一个服务器应用程序,它打开一个套接字并监听连接。在应用程序中,我有一个单独的线程,它创建一个套接字,绑定它并调用它上面的listen和accept函数。
当应用程序关闭时,我在创建的套接字上调用closesocket,然后等待套接字线程关闭。但是,如果线程正在等待accept函数,则线程永远不会完成。
我认为在调用cloasesocket之后,accept函数会返回。这是正确的想法吗?如果是这样,为什么accept函数不返回?是否有另一种方法可以使accept函数返回?
答案 0 :(得分:4)
除非accept
表示没问,否则请勿致电select
。在这种情况下,accept
永远不会阻止。
答案 1 :(得分:0)
查看手册页... http://linux.die.net/man/2/accept
套接字A上的 accept()
块,当新连接进入时,返回一个新的套接字B来连接客户端。这通常是一个紧密的循环,fork()和exec()将新连接发送到子进程来处理连接,而父进程返回到accept()以等待另一个连接。
你是否试图说你的程序中的另一个线程从accept()调用下关闭套接字A?
答案 2 :(得分:0)
我看到一个类似的问题,即WSAStartup
和WSACleanup
的调用未达到平衡。
在调用WSACleanup
调用之前,程序正在调用closesocket
。
试图关闭套接字的线程都会阻塞。
当我删除了额外的'事情有所改善{/ 1}}。
在其他地方,它说调用WSACleanup
会释放对WSACleanup
的调用但出现错误,但我不确定这是真的......还有谁知道还有什么如果你不能匹配那些启动和清理功能,那就错了。