阻塞套接字 - 检测状态

时间:2012-12-18 18:31:35

标签: c++ c sockets

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

应用程序正在使用阻塞套接字,因为在没有阻塞选项直到数据可用时,我没有想到让我的线程连续循环更好。

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

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

谢谢你。我已经粘贴了我的readImageInt()函数,它显示了我如何从socket中读取。我正在使用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;
    }

}

2 个答案:

答案 0 :(得分:1)

您可以设置SO_RCVTIMEO socket option以摆脱长时间阻止接收操作。

编辑0:

或者,您可以使用select(2)poll(2)(或epoll_wait(2),如果您在Linux上)进行轮询调用,并且超时。那将允许你突破内核中的等待来检查一些用户输入,告诉你是继续等待还是保释。

检测断开连接的更可靠的方法是发送数据,如果另一方支持它 - 你会得到一个信号或错误返回(虽然在崩溃的远端可能在分钟的顺序。)

编辑1:

查看select_tut(2)

答案 1 :(得分:0)

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