断开tcpip连接方法

断开tcpip连接方法,c,tcp,connect,C,Tcp,Connect,它不是真正的复制品。当使用非块套接字时,必须使用select方法检查是否创建了连接,在select方法中可以设置超时值以终止连接。比方说,如果我想在预设超时值之前中断select方法,这也是同样的问题。在我的情况下,如果打印机正在忙着做一些事情而没有时间回复,则选择超时时间最多可达5分钟 从另一个线程关闭套接字以取消连接,或者选择,似乎是解决我的问题的最佳方法 我有一个程序连接到一个远程TCPIP端口,它是一个打印机 SOCKET socket = socket(AF_INET, SOCK_ST

它不是真正的复制品。当使用非块套接字时,必须使用select方法检查是否创建了连接,在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方法?如果发现打印机未打开,我想取消连接,而不是停止应用程序,而是继续执行一些日志记录工作

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


我不能在这里使用none block socket,因为这是一个非常大的项目,其他所有东西都是由其他人使用block socket设计的。不允许我做大的更改。

解除连接阻塞的最简单方法是关闭套接字。不幸的是,在等待连接时,您的thead被挂起,因此您必须从另一个线程关闭套接字


另一种解决方案是使用异步io Windows,通过重叠io实现这一点。在linux上,可以将套接字设置为非阻塞。这将导致连接在后台进行时立即返回。然后可以使用select或poll等待套接字就绪。如果将stdin添加到select,按键将中断select abd,并可根据需要进行处理。

什么是tcpip端口?有TCP,也有IP。两者都是不同的网络层。@Olaf这太迂腐了——将两者结合在一起并称之为TCPIP@Alnitak当前位置数百万只苍蝇不会错:吃sh**:-认真地说:仅仅因为它用错了并不意味着它应该错。混淆网络层是造成概念错误和问题的一个常见原因。如果问什么是tcpip(通常称为TCP/IP),那就太迂腐了。我正在尝试,但这需要一段时间。套接字被打开并存储在结构中,我必须让主线程访问套接字。最简单的方法效果最好。我只是从主线程调用closesocket,然后它从阻塞连接方法中断。17:00:08.371连接到172.20.17.26:5001 17:00:08.549立即取消17:00:08.549连接失败10038