我正在读取从Java客户端发送到Socket的C服务器的图像URL . 当检测到char缓冲区[]中有空字符时,服务器停止通过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);
}
Is there a better and more elegant way to make this?
我读到了首先发送URL的大小,但我不确切知道如何使用它来停止recv() . 我想这是通过计算收到的字节直到达到URL的大小来完成的 . 那一刻,我们应该读完了 .
另一种方法可能是关闭Java套接字,以便recv()返回-1并且循环将完成 . 但是,考虑到我的Java客户端等待来自C服务器的响应,关闭套接字然后重新打开它似乎不是一个合适的选择 .
谢谢,Héctor
1 回答
除了你的缓冲区有一个不寻常的大小(一个通常选择2的幂,所以8,16,32,...),它看起来有点小的意图,你的方法似乎对我来说:
我假设你的java客户端将发送一个空终止的字符串然后等待,我 . 即特别是它不会发送任何进一步的数据 . 因此,在收到0字符之后,无论如何都不会有任何数据接收,所以不需要为recv隐式显式的事情而烦恼(recv通常只返回可用的数据,即使小于缓冲区也是如此)可以消费) .
请注意,您使用0初始化缓冲区,因此如果您检查整个缓冲区(而不是范围[
buffer, buffer + bytes
),您可能会检测到误报(如果您在第一次迭代中收到少于12个字符)!但是,无论如何,检测0字符可以更优雅地完成: