中断连接窗口wsa插座

时间:2012-03-10 10:02:09

标签: windows sockets msdn

我只是想知道是否可以中断对windows socket“connect”函数的调用?

问题是我的代码要求在不同的线程中完成(因此GUI线程一直在运行)。但是当程序关闭时,我仍然是调用“连接”的线程,这些线程正在为WSAETIMEDOUT异常而烦恼。

有什么想法吗?

更新/提示:我不能调用close()因为我在connect()返回时只有一个有效的句柄。当使用阻塞套接字并将tcp-connect连接到防火墙位置时(例如),后者不是这种情况:/

1 个答案:

答案 0 :(得分:0)

如果套接字处于阻塞模式,则中止connect()调用的唯一方法是从与调用connect()的线程上下文不同的线程上下文关闭套接字。 connect()将返回错误,然后线程可以正常退出。

如果套接字处于非阻止或重叠模式,connect()将立即返回WSAEWOULDBLOCK错误,然后您必须致电select()WSAAsyncSelect(FD_CONNECT),或WSAEventSelect(FD_CONNECT)在继续执行套接字工作之前检测连接何时建立。由于调用线程未在connect()上被阻止,因此可以自由地定期检查来自其余代码的任何终止/中止信号,如果检测到则关闭套接字(如果需要)并正常退出。 / p>

如果您以非阻塞或重叠模式编写套接字代码,那么您实际上不需要使用线程。您可以在主线程中执行套接字工作而不会阻止UI,然后您可以在需要时关闭套接字。以这种方式编码需要更多的工作,但它确实有效。或者您可以继续使用线程。它会使您的套接字代码与您的UI代码分开,从而更容易管理。