它并没有真正重复。使用非块套接字时,必须使用select方法检查是否创建了连接,在select方法中,您可以设置终止超时值。让我们说如果我想在预设的超时值之前打破选择方法,它又会出现同样的问题。在我的情况下,选择超时最长可达5分钟,以防打印机忙于做某事并且没有时间回复。
从另一个线程关闭套接字取消连接,或选择,似乎是我问题的最佳解决方案。
我有程序连接到远程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...
}
只要打印机打开,它就可以正常工作。如果打印机关闭,连接将失败并且主机无法访问",这也没关系。
如果打印机关闭,连接方法将被阻止约20至21秒,然后返回失败。这个20秒应该根据某些系统配置来计算,并且可能但很难改变。在其他系统上,这可能会更长。
我的问题是,是否可以通过另一个线程的另一个调用来断开connect方法?我想取消连接,以防我发现打印机没有打开,不是停止应用程序而是继续做一些日志记录工作。
如果我将调试附加到进程,暂停然后继续,它似乎会提前中断。
我不能在这里使用非块套接字,因为它是一个非常大的项目,而其他所有东西都是由其他人设计的。我不被允许做大的改变。
答案 0 :(得分:1)
解除连接阻塞的最简单方法是关闭套接字。不幸的是,在等待连接时你的thead被暂停,所以你必须从另一个线程关闭套接字。
另一种解决方案是使用异步io Windows使用OVERLAPPED io。在linux上,可以将套接字设置为非阻塞。这将导致连接在后台发生连接时立即返回。然后可以使用select或poll来等待套接字准备就绪。如果将stdin添加到select中,则按键将中断select abd可以根据需要进行处理。