`read()`多次,还是在网络编程中一次?

问题描述 投票:0回答:1

在网络编程中使用c语言

read()
函数更好的做法是什么?

某些程序读取第一个标头字节,并在每种情况下读取附加字节。 有些程序读取缓冲区的总大小并传递缓冲区指针。

  1. 读取第一个标头字节,并在每种情况下读取附加字节。
main(){
   unsigned char buffer[MAX_SIZE];
   read(socket, buffer, 1);
   switch(buffer[0]) {
       case MSG_TYPE_1:
           handle_1(socket);
           break;
       case MSG_TYPE_2:
           handle_2(socket);
           break;
   }
}
handle_1(int socket){
   unsigned char buffer[8];
   read(socket, buffer, 8)'
   /// handle buffer ...
}
handle_1(int socket){
   unsigned char buffer[24];
   read(socket, buffer, 24)'
   /// handle buffer ...
}
  1. 读取缓冲区大小的最大字节,并将缓冲区指针传递给每个处理函数。
main(){
   unsigned char buffer[MAX_SIZE];
   unsigned int length = read(socket, buffer, MAX_SIZE);
   switch(buffer[0]) {
       case MSG_TYPE_1:
           handle_1(buffer, length);
           break;
       case MSG_TYPE_2:
           handle_2(buffer, length);
           break;
   }
}
handle_1(unsigned char *buffer, unsigned int length){
   /// handle buffer ...
   }
}

更标准的方法是什么?

我看到第一个案例读取了每个案例的特定字节。我在这里还有另一个问题: 请求 read() 字节数多于实际接收字节数的开销是多少?

比如对方实际发送的字节是10个字节,但我

read(socket, buffer, 100);
我知道
read()
的返回值为10,但是有开销吗?

c tcp network-programming
1个回答
0
投票

好吧,这些都不是好的做法,因为它行不通。您没有查看和使用

read()
的返回值。
read()
的一个非常重要的行为是,它将返回立即可用的内容,如果它不是常规文件,则可能会少于您所要求的内容。它总是会等待至少一个字节,这样如果它返回零字节,您就知道已经到达末尾。但是,当您请求八个字节时,它可能会返回五个。如果你不处理这个问题,你的程序将无法运行。

© www.soinside.com 2019 - 2024. All rights reserved.