中断连接窗口wsa套接字

问题描述:

我只是想知道是否有可能中断调用Windows套接字“连接”功能?中断连接窗口wsa套接字

问题是我的代码需要在不同的线程中完成(所以GUI线程一直运行)。但是,当程序关闭时,我仍然有线程调用“连接”,WSAETIMEDOUT例外。

任何想法?

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

如果套接字处于阻塞模式,则中止connect()调用的唯一方法是关闭来自不同线程环境的套接字,而不是调用connect()的套接字。 connect()将返回一个错误,然后线程可以正常退出本身。

如果插座连接器处于非阻隔或重叠模式,connect()将与WSAEWOULDBLOCK错误立即返回,然后你必须调用select()WSAAsyncSelect(FD_CONNECT),或WSAEventSelect(FD_CONNECT)检测到您的插座,然后再继续当连接已建立工作。由于调用线程在connect()上没有被阻塞,所以可以*地定期检查代码的其余部分是否有终止/中止信号,如果检测到,则关闭套接字(如果需要)并正常退出。

如果你以非阻塞或重叠模式编写你的套接字代码,那么你并不需要使用线程。您可以在主线程内完成套接字工作而不会阻塞您的用户界面,然后您可以在需要时关闭套接字。它需要更多的工作来编码,但它确实有效。或者你可以继续使用线程。它将使您的套接字代码与您的UI代码分开,从而使其更具管理性。

+0

这是一个大问题,我不能打电话关闭(),因为我没有任何处理操作。当初始套接字connect()调用终止时,我将只有这个句柄。 所以它的鸡蛋问题在这里 – willsteel 2012-03-14 21:42:51

+0

你关闭了'socket()'返回的句柄。 'connect()'将现有的套接字句柄作为输入。它不返回一个新的套接字句柄。所以只要确保你将'socket()'的套接字句柄存储在连接线程和关闭线程都可以访问的地方。 – 2012-03-14 22:19:07