中断 tcpip 连接方法

break tcpip connect method

这不是真的重复。当使用 none-block socket 时,你必须使用 select 方法来检查连接是否被创建,在 select 方法中你可以设置一个超时值来终止。比方说,如果我想在预设超时值之前打破 select 方法,它又是同样的问题。在我的例子中,select 超时可以长达 5 分钟,以防打印机忙于做某事而没有时间回复。

从另一个线程关闭套接字以取消连接,或者 select,似乎是解决我的问题的最佳方法。

我有程序连接到远程 TCPIP 端口,它是一台打印机。

SOCKET socket = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in  SockAddr;
//...  initialized host and port and so on
int iret = connect(socket, &SockAddr, sizeof(SockAddr));
if (iret != 0)
{
    // get error code...
}

就打印机而言,它工作正常。如果打印机关闭,连接将失败,"host not reachable",也可以。

如果打印机关闭,连接方法将被阻塞约 20 到 21 秒,然后 return 失败。这 20 秒应该是根据某些系统配置计算的,它是可能的,但很难更改。在其他系统上,这可能会更长。

我的问题是,是否可以通过另一个线程的另一个调用来中断 connect 方法?我想在发现打印机未打开时取消连接,不是停止应用程序而是继续执行一些日志记录作业。

如果我将调试附加到进程,暂停然后继续,它似乎会提前中断。

我这里不能用none-block socket,因为工程很大,其他都是别人用block socket设计的。我不允许做大的改变。

取消阻止连接的最简单方法是关闭套接字。不幸的是,在等待连接时,你的 thead 被挂起,所以你必须从另一个线程关闭套接字。

替代解决方案是使用异步 io Windows 使用 OVERLAPPED io 执行此操作。在 linux 上,可以将套接字设置为非阻塞。这将导致在后台发生连接时立即连接到 return。然后可以使用 select 或轮询来等待套接字准备就绪。如果将 stdin 添加到 select,按键将中断 select abd 可以根据需要进行处理。