为什么socketock接受函数不会在closesock调用后释放?

时间:2010-10-29 17:23:24

标签: c++ sockets

我有一个服务器应用程序,它打开一个套接字并监听连接。在应用程序中,我有一个单独的线程,它创建一个套接字,绑定它并调用它上面的listen和accept函数。

当应用程序关闭时,我在创建的套接字上调用closesocket,然后等待套接字线程关闭。但是,如果线程正在等待accept函数,则线程永远不会完成。

我认为在调用cloasesocket之后,accept函数会返回。这是正确的想法吗?如果是这样,为什么accept函数不返回?是否有另一种方法可以使accept函数返回?

3 个答案:

答案 0 :(得分:4)

除非accept表示没问,否则请勿致电select。在这种情况下,accept永远不会阻止。

答案 1 :(得分:0)

查看手册页... http://linux.die.net/man/2/accept

套接字A上的

accept()块,当新连接进入时,返回一个新的套接字B来连接客户端。这通常是一个紧密的循环,fork()和exec()将新连接发送到子进程来处理连接,而父进程返回到accept()以等待另一个连接。

你是否试图说你的程序中的另一个线程从accept()调用下关闭套接字A?

答案 2 :(得分:0)

我看到一个类似的问题,即WSAStartupWSACleanup的调用未达到平衡。

在调用WSACleanup调用之前,程序正在调用closesocket。 试图关闭套接字的线程都会阻塞。 当我删除了额外的'事情有所改善{/ 1}}。

在其他地方,它说调用WSACleanup会释放对WSACleanup的调用但出现错误,但我不确定这是真的......还有谁知道还有什么如果你不能匹配那些启动和清理功能,那就错了。