【发布时间】:2026-01-29 11:05:01
【问题描述】:
我正在尝试用 C 语言制作一个简单的服务器客户端程序。在客户端上我尝试从服务器接收消息,但消息的大小没有预先确定。因此,我想检查有多少字节进来,malloc 的大小合适。
我尝试使用ioctl,但它似乎获得了我想要的信息为时已晚。
这就是我所拥有的。
char *message_from_server;
int length;
while(1){
ioctl(socket, FIONREAD, &length);
message_from_server = malloc(length);
read(socket, message_from_server, length);
}
第一次使用时,length 为 0。第二次,长度等于第一条消息的长度。如果我在阅读后添加ioctl(socket, FIONREAD, &length); 行,这可能会给我分配正确的空间量带来麻烦。这甚至是解决我的问题的有效方法吗?
我听说有人可以使用realloc 来解决我的问题,但我正在努力寻找如何解决我的问题。如果这是一种更好的方法,我很乐意提供任何提示。
谢谢!
【问题讨论】:
-
只有 TCP,传入数据的大小是预先确定的。它将是一个字节或更大的东西。如果您试图通过使用 ioctl 'peeking' 来实现超过一个再见的应用程序消息,或者假设 read() 将始终加载长度超过一个字节的完整消息的缓冲区,那么您很快就会遇到麻烦。