无法读取从客户端发送的所有消息
Unable to read all messages sent from client
我想读取从客户端发送的所有消息。我正在实施一个 tcp 服务器,它接收数据。每条消息都附加消息的大小作为标头。所以现在我可以读取标头并从中找到大小,并为稍后读取的消息分配大量内存。然而,由于我很少接触C++这就是我想出的。
如何阅读所有消息?
void *dothistask(void *socket_desc)
{
int sock = *(int*)socket_desc;
free(socket_desc);
int read_size;
unsigned int x = 4;
char *header = (char*)malloc(sizeof(char) * 4);
char *message;
int index = 0;
long p;
int status;
while(true) {
status = ReadXBytes(sock, 4, header);
if(status == -1)
{
break;
}
message = (char *)malloc(sizeof(char) * 10);
status = ReadXBytes(sock, 10, message);
if(status == -1)
{
break;
}
cout<<"The header is "<<header<<endl;
cout<<"The message is "<<message<<endl;
}
return 0;
}
int ReadXBytes(int socket, unsigned int x, void* buff)
{
char *buffer = (char*)buff;
int bytesRead = 0;
int result;
while (bytesRead < x)
{
result = recv(socket, buffer + bytesRead, x - bytesRead, 0);
if(result == 0)
{
cout<<"Client disconnected"<<endl;
fflush(stdout);
return -1;
}
else if( result == -1)
{
perror("recv failed");
return -1;
}
bytesRead += result;
}
return 0;
}
阅读,最好先阅读标题,然后再阅读消息。我可以这样做一次,但我想在一段时间内重复执行此操作,基本上是永远这样做,直到客户端断开连接。
谢谢!谢谢你的帮助!
要阅读该消息,您有
ReadXBytes(sock, 10, message);
但它应该是这样的
ReadXBytes(sock, *((int*)header), message);
取决于标题的内容。由于您有一个硬编码的10
,因此您只会读取 10 个字节。您还必须相应地调整malloc
,不仅要分配 10 个字节。
相关文章:
- 应该如何读取堆缓冲区溢出错误消息?
- C++输出与Python不同的消息(从串行端口读取)
- 读取系统() 命令错误响应消息
- 有没有办法在不使用 set_buff() 的情况下从文件中读取并填充消息增益
- boost::asio::async_read_until 不会读取所有消息
- 套接字记录未读取任何消息
- 为什么 protobuf 只读取最后一条消息作为输入结果
- 协议缓冲区-读取所有消息中通用的标头(嵌套消息)
- 使用Boost Json读取JSON消息
- 如何正确读取套接字消息(C++)
- 无法读取从客户端发送的所有消息
- boost asio读取动态大小消息
- 读取功能失败时的成功消息
- 在 c++ 中使用消息结构读取/填充数据缓冲区的正确方法是什么?
- 正在读取RSysLog tcp消息
- 在Windows上从文件中读取多个分隔的protobuf消息
- 读取未声明错误消息
- 按升序从消息队列中读取数据
- UDP套接字是否将接收到的数据划分为不同的消息,或者recv是否同时读取尽可能多的数据
- Qt TCP服务器/多客户端消息读取