通过 send() 发送 10 条消息,同时通过 recv() 接收更多消息

Send 10 message through send() while receive more message through recv()

server.c

if (retSize == -2)
{
    if (send(client_sock, buf, BUF_SIZE, 0) == -1)
    {
        close_socket(client_sock);
        close_socket(sock);
        fprintf(stderr, "Error1 sending to client.\n");
        return EXIT_FAILURE;
    }
    printf("You have sent %d msg\n", ++cntOfMsg);
    printf("The msg is:\n %s\n", buf);
    printf("------------\n");
}
else
{
    if (send(client_sock, ret, BUF_SIZE, 0) == -1)
    {
        close_socket(client_sock);
        close_socket(sock);
        fprintf(stderr, "Error2 sending to client.\n");
        return EXIT_FAILURE;
    }
    printf("You have sent %d msg\n", ++cntOfMsg);
    printf("The msg is:\n %s\n", ret);
    printf("------------\n");
}

client.c

while ((bytes_received = recv(sock, buf, BUF_SIZE, 0)) > 1)
{
    buf[bytes_received] = '[=11=]';
    printf("You have received %d msg\n",++cnt);
    fprintf(stdout, "Received:\n%s\n", buf);
    printf("-----------\n");
    memset(buf,0,sizeof(buf));
}

部分输出如下图:

注意:
像“不能写 error_log”或“语法错误”这样的输出与 problem.Your 无关可以相信我显示的代码是发送或接收的唯一地方。

在每个 recv() 上,您只是递增 cnt 变量并打印,它并不代表接收到的字节数。尝试打印 bytes_received
同理,在send()部分,打印send()调用的return值,而不是cntOfMsg

TCP 发送可以根据需要对数据进行分段。如果您发送小缓冲区,TCP 可以将它们分组并在超时或收到挂起的确认后将它们作为单个数据包发送。如果您发送大缓冲区,TCP 可以将它们分成一系列较小的数据包,有利于 TCP 分段而不是 IP 分段。

TCP recv 理论上可以 return 只有 1 个字节,即使您认为应该有更多数据等待。

当使用 TCP 发送记录时,您需要使用记录层为每条记录添加长度(例如,big-endian 顺序的 32 位整数)。然后接收方必须累加一个长度(理论上一次可以滴入 1 个字节),然后累加该长度描述的记录内容。接收方ping-pongs在累加长度和累加记录内容之间

在 line-oriented 协议中,您可以使用换行符来划定记录边界。如何在 TCP 字节流中指示边界完全由您决定。