gpt4 book ai didi

c - 中断 tcpip 连接方法

转载 作者:行者123 更新时间:2023-11-30 19:10:32 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





C: socket connection timeout

(8 个回答)


5年前关闭。




它并没有真正复制。使用非阻塞套接字时,您必须使用 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 秒应该是从某些系统配置中计算出来的,它是可能的,但很难改变。在其他系统上,这可能会更长。

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

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

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

最佳答案

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

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

关于c - 中断 tcpip 连接方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41123369/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com