3

我正在开发我的第一个 c/c++ 应用程序并使用套接字。此应用程序连接到服务器并读取从服务器发送的图像数据,图像数据前面有一些感兴趣的整数,例如要读取多少数据。

该应用程序正在使用阻塞套接字,因为当可以选择阻塞直到数据可用时,我认为让我的线程连续循环不会更好。

我现在的问题是,如果服务器只是失去与网络的连接,我的应用程序就坐在那里,我无法触发给用户的通知或尝试重新连接。我不知道如何检查连接状态。

有人可以就如何解决我的问题给我一些建议吗?

谢谢你。我已经粘贴了我的 readImageInt() 函数,它显示了我是如何从套接字读取的。我正在使用 linux 设备进行开发。

int readImageInt()
{

int nb, i;
union {
    long int whole;
    char bytes[4];
} v;
memset(v.bytes, 0x00, 4);
nb = recv(imagesock, v.bytes, 4, MSG_WAITALL);
if (nb == 0||nb == -1)
 {

    return -1;
 }
else
    {
    v.whole = ntohl(v.whole);

     return v.whole;
    }

}
4

2 回答 2

1

您可以设置套接字选项以突破长阻塞接收操作。SO_RCVTIMEO

编辑0:

或者,您可以使用像select(2), poll(2)(或者epoll_wait(2)如果您在 Linux 上)这样的轮询调用超时。这将允许您摆脱内核等待检查,例如,一些用户输入告诉您是继续等待还是保释。

不过,检测断开连接的更可靠方法是在对方支持的情况下发送数据 - 您将收到信号或错误返回(尽管在崩溃的远程端可能需要几分钟)。

编辑1:

看一眼select_tut(2)

于 2012-12-18T18:48:10.703 回答
0

您可以考虑在接收任何数据之前使用 select 函数来检查套接字的状态。请参阅此处,例如http://support.sas.com/documentation/onlinedoc/sasc/doc750/html/lr2/select.htm

于 2012-12-18T19:02:54.500 回答