【发布时间】:2016-06-30 15:47:29
【问题描述】:
我正在读取从 Java 客户端从套接字发送到 C++ 服务器的图像 URL。当服务器检测到 char buffer[] 中存在空字符时,服务器停止读取 recv(),如下面的代码所示:
void * SocketServer::clientController(void *obj)
{
// Retrieve client connection information
dataSocket *data = (dataSocket*) obj;
// Receive data from a client step by step and append data in String message
string message;
int bytes = 0;
do
{
char buffer[12] = {0};
bytes = recv(data->descriptor, buffer, 12, 0);
if (bytes > 0) // Build message
{
message.append(buffer, bytes);
cout << "Message: " << message << endl;
}
else // Error when receiving it
cout << "Error receiving image URL" << endl;
// Check if we are finished reading the image link
unsigned int i = 0;
bool finished = false;
while (i < sizeof(buffer) / sizeof(buffer[0]) && !finished)
{
finished = buffer[i] == '\0';
i++;
}
if (finished)
break;
}
while (bytes > 0);
cout << message << endl;
close(data->descriptor);
pthread_exit(NULL);
}
有没有更好、更优雅的方法来做到这一点?
我读到了先发送 URL 的大小,但我不知道如何用它来停止 recv()。我想这是通过计算接收到的字节数来完成的,直到达到 URL 的大小。那一刻,我们应该读完了。
另一种方法可能是关闭 Java 套接字,这样 recv() 将返回 -1 并结束循环。但是,考虑到我的 Java 客户端等待来自 C++ 服务器的响应,关闭套接字然后重新打开它似乎不是一个合适的选择。
谢谢, 赫克托
【问题讨论】: