【发布时间】:2016-02-13 19:56:37
【问题描述】:
我有一个连接到某个服务器的应用程序。它可以同步发送数据(发送和等待应答)和异步接收数据。 我做了2个线程。在无限循环的第一个线程中,我发送数据并等待答案。在第二个线程中,我从服务器获取数据并将它们推送到队列中。 但是,如果在我发送数据时(在第一个线程中)发生了一些错误,我必须关闭套接字。以及如何检查套接字已关闭的第二个线程?
第二个线程中的代码:
while (processing) {
nbytes = recv(socketDesc, canFrame, sizeof(data), 0);
if (nbytes > 0) {
push_queue(data);
}
if (nbytes < 0) {
throw "Error in read data from socket!";
}
}
如果我在第二个线程函数recv 的第一个线程中关闭套接字不会出错。现在我使用超时,像这样:
setsockopt(this->socketDesc, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv));
setsockopt(this->socketDesc, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(tv));
当我没有从服务器(在第一个线程中)得到答案时发生错误时,我将变量 processing 设置为 false 并且在超时到期后(在函数 recv 中)循环结束。我可以在函数recv 中一次检查套接字关闭吗?
【问题讨论】:
-
如何关闭套接字?使用关闭()?您是否尝试过使用 shutdown() 代替? shutdown() 具有丢弃挂起的读取和/或写入数据的选项,因此可以提供帮助。