从C套接字读取预期数据包的最大大小

时间:2015-08-06 23:50:38

标签: c sockets tcp

我有一个客户端/服务器程序。客户端向服务器发送消息,服务器处理此消息并返回客户端。

客户端消息的前四个字节是整个消息的大小。我也知道消息的最大大小。但是,消息的大小可变。

我在while循环中使用read函数来读取客户端消息

while((n = read(socket, buffer, MAX_SIZE)) != 0){
    process_message();
    write(socket, ...);
}

我想知道读取更多字节是否比客户端发送的更多?我可以先读取消息的大小,然后读取确切的字节数,但我想知道是否有必要。

1 个答案:

答案 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