我有一个客户端/服务器程序。客户端向服务器发送消息,服务器处理此消息并返回客户端。
客户端消息的前四个字节是整个消息的大小。我也知道消息的最大大小。但是,消息的大小可变。
我在while循环中使用read函数来读取客户端消息
while((n = read(socket, buffer, MAX_SIZE)) != 0){
process_message();
write(socket, ...);
}
我想知道读取更多字节是否比客户端发送的更多?我可以先读取消息的大小,然后读取确切的字节数,但我想知道是否有必要。
答案 0 :(得分:2)
正如其他一些评论中所提到的,从套接字读取可以返回任意数量的字节,直到请求的最大值。
一个更好的循环,尽管仍然没有问题,但这些都是这样的:
/* 4 byte message header that contains the length */
#define MSG_HEADER_SIZE 4
#define MAX_MESSAGE_LENGTH 128
struct message {
uint32_t length;
char body[MAX_MESSAGE_LENGTH];
};
#define BUFFER_SIZE 1024
char buffer[BUFFER_SIZE];
uint32_t buf_used = 0;
/* main loop */
while (1) {
n = recv(socket, buffer + buf_used, sizeof(buffer) - buf_used, 0);
if (n == -1) {
/* handle error */
exit(1);
}
if (n == 0) {
/* connection closed, do something. */
exit(1);
}
buf_used += n;
/* check for partial/completed message(s) */
while (buf_used >= MSG_HEADER_SIZE) {
struct message *cur_msg = (struct message *) buffer;
uint32_t total_msg_length;
total_msg_length = cur_msg->length + MSG_HEADER_SIZE;
/* is this message completed yet? */
if (buf_used >= total_msg_length) {
process_message(cur_msg);
/* remove message since it has been processed */
buf_used -= total_msg_length;
/* this could potentially be optimized */
memmove(buffer, buffer + total_msg_length, buf_used);
} else {
/* have incomplete message */
break;
}
}
}
有关套接字编程的介绍,我建议您查看Beej's Guide to Network Programming。