C套接字请求缓冲

时间:2012-08-19 15:34:33

标签: c sockets

我有一个简单的服务器 - 客户端模型。服务器向客户端发送一些加密消息。然后,客户端使用消息的前几个字符来决定处理。问题是这些消息一个接一个地被缓冲,因此我丢失了在第一个消息之后缓冲的所有消息。是否有一种简单的方法可以防止缓冲或告诉send函数刷新。

1 个答案:

答案 0 :(得分:0)

您的客户端必须确定应该读取多少字节才能处理。服务器将一个接一个地发送一条消息,但是流式套接字允许字节流动,就像它是一条长消息一样。您的消息需要某种方式让客户知道何时结束而下一个结束。

在流式套接字中执行此操作的最简单方法是使用消息的长度预先添加消息。所以客户端首先读取长度,然后客户端读取那么多字节。

int send_message (int sock, const void *message, uint32_t len) {
    int r;
    uint32_t mlen = htonl(len);
    r = send(sock, &mlen, 4, 0);
    /* ...error checking... */
    r = send(sock, message, len, 0);
    /* ...error checking... */
    return ok ? len : error;
}

int recv_message (int sock, void *buf, uint32_t size) {
    int r;
    uint32_t mlen;
    r = recv(sock, &mlen, 4, 0);
    /* ...error checking... */
    mlen = ntohl(len);
    /* ...check buf is large enough... */
    r = recv(sock, buf, mlen, 0);
    /* ...error checking... */
    return ok ? mlen : error;
}