【发布时间】: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”,这将过于迂腐。)。