0

我有一个小型应用程序,可以重定向另一个应用程序的标准输出/输入(通常是命令提示符或 Windows 的 bash)。问题是,如果连接被中断,我的进程不知道并且由于这条线它永远不会关闭:

WaitForSingleObject(childProcess.hThread, INFINITE)

我正在考虑使用这样的循环:

while(true)
{
     if(ProcessIsDead(childProcess.hThread))
      // close socket and exit
    if(SocketIsDisocnnected(hSocket))
    // close process and exit

}

我将使用哪些功能来完成此操作?对于 ProcessIsDead,我知道有一个用于获取退出代码的 winapi,但我不知道如何在不调用 recv 的情况下检查套接字是否断开(我不能这样做)

4

2 回答 2

4

注意:我假设连接的套接字正在通过网络链接进行通信,因为我不确定如果它是本地管道,它将如何断开连接,除非一个进程或另一个进程死亡。

使用socket API中的select()函数查询socket的读取状态。如果以下任何一项为真,select() 将告诉您套接字是“可读的”:

  • 如果已调用listen 并且连接处于挂起状态,则accept 将成功。
  • 数据可供读取(如果启用了 SO_OOBINLINE,则包括 OOB 数据)。
  • 连接已关闭/重置/终止。

因此,如果 select() 表示套接字是可读的,则调用 recv() 是安全的,如果连接分别被重置或关闭,它将为您提供 WSACONNRESET 或返回 0 字节。select() 采用“超时”参数,如果要轮询套接字状态,可以将其设置为适当的时间间隔或零。

关于 select() 函数的信息位于http://msdn.microsoft.com/en-us/library/ms740141(VS.85).aspx

于 2009-10-19T03:16:14.090 回答
0

case-1:如果对方关闭了连接,当你读取 tne 套接字时你会得到 0 个字节(准确地接收到 FIN),是时候关闭套接字了。

案例2:您可以在获得足够的数据包后调用 close() 来关闭套接字。

case-3:如果在读或写套接字时被中断,你会得到EINTR或EAGAIN,然后请重新读/写。

case 1-3 是独立于线程的,因为如果有can-read、can-write或errors等事件,系统会通知你;所以你有机会处理这些事件。请尝试不同的 I/O 模型。

于 2009-10-19T03:33:39.733 回答