在网络编程中使用c语言
read()
函数更好的做法是什么?
某些程序读取第一个标头字节,并在每种情况下读取附加字节。 有些程序读取缓冲区的总大小并传递缓冲区指针。
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 ...
}
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,但是有开销吗?
好吧,这些都不是好的做法,因为它行不通。您没有查看和使用
read()
的返回值。 read()
的一个非常重要的行为是,它将返回立即可用的内容,如果它不是常规文件,则可能会少于您所要求的内容。它总是会等待至少一个字节,这样如果它返回零字节,您就知道已经到达末尾。但是,当您请求八个字节时,它可能会返回五个。如果你不处理这个问题,你的程序将无法运行。