【问题标题】:break tcpip connect method [duplicate]中断tcpip连接方法[重复]
【发布时间】:2017-04-28 15:33:10
【问题描述】:

它并没有真正复制。当使用非阻塞套接字时,您必须使用 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...
}

就打印机而言,它工作正常。万一打印机被关闭,连接会失败,出现“host not reachable”,也可以。

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

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

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

我不能在这里使用非阻塞套接字,因为这是一个非常大的项目,其他所有东西都是由其他人用阻塞套接字设计的。我不被允许做大的改变。

【问题讨论】:

  • 什么是“tcpip 端口”?有TCP,有IP。两者都是不同的网络层。
  • @Olaf 太迂腐了 - 将两者结合在一起并称之为 TCPIP 是非常常见的
  • @Alnitak:“数以百万计的苍蝇不会错:吃 sh**”:-) 说真的:仅仅因为它被错误地使用并不意味着它应该是。混淆网络层是误解和问题的常见原因之一。 (尽管问“tcpip”是什么,因为它通常被称为“TCP/IP”,这将过于迂腐。)。

标签: c tcp connect


【解决方案1】:

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

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

【讨论】:

  • 我正在尝试这个,但这需要一段时间。套接字打开并存储在结构中,我必须让主线程访问套接字。
  • 最简单的方法效果最好。我只是从主线程调用 closesocket,然后它从阻塞的连接方法中中断。 17:00:08.371 连接到 172.20.17.26:5001 17:00:08.549 现在取消 17:00:08.549 连接失败 10038
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
  • 2013-09-13
  • 1970-01-01
相关资源
最近更新 更多