我正在开发我的第一个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;
}
}
答案 0 :(得分:1)
您可以设置SO_RCVTIMEO
socket option以摆脱长时间阻止接收操作。
或者,您可以使用select(2)
,poll(2)
(或epoll_wait(2)
,如果您在Linux上)进行轮询调用,并且超时。那将允许你突破内核中的等待来检查一些用户输入,告诉你是继续等待还是保释。
检测断开连接的更可靠的方法是发送数据,如果另一方支持它 - 你会得到一个信号或错误返回(虽然在崩溃的远端可能在分钟的顺序。)
答案 1 :(得分:0)
您可以考虑使用select函数在接收任何数据之前检查套接字的状态。请参阅此处http://support.sas.com/documentation/onlinedoc/sasc/doc750/html/lr2/select.htm