c - TCP 客户端无法将字符串发送到服务器

标签 c linux tcp send

我正在编写 TCP 服务器客户端。我使用单独的 send 系统调用分别发送三个字符串。 但是接收端我只得到一个字符串,它是我发送的第一个字符串。剩下的两个字符串未命中。

下面我给出了我的服务器客户端程序的一部分。

客户端.c

char *info = "infolog";
char *size = "filesize";
char *end = "fileend";
send(client, info, strlen(info)+1, 0);
send(client, size, strlen(size)+1, 0);
send(client, end, strlen(end)+1, 0);

服务器.c

while ((read_size = recv(client, msg, sizeof(msg), 0))) {
    printf("Data: %s\n", msg);
    memset(msg, 0, sizeof(msg));
}

实际输出:

Data: infolog

预期输出

Data: infolog
Data: filesize
Data: fileend

谢谢。

最佳答案

尝试打印出 read_size。您可能已经收到了所有消息。

由于Nagle's Algorithm ,发件人可能将您的三个 send() 调用分批处理并向服务器发送了一个数据包。虽然您可以禁用 Nagle 算法,但我认为在这种情况下这不是一个好主意。您的服务器需要能够处理部分数据的接收,并处理接收比预期更多的数据。

您可能想研究为您的消息使用上层协议(protocol),例如 Google Protocol Buffers .看看 techniques页面,在那里他们描述了他们如何做:建立一个 Protocol Buffer ,并在写入缓冲区本身之前将其长度写入流。这样接收方就可以读取长度,然后确定在获得完整消息之前需要读取多少字节。

关于c - TCP 客户端无法将字符串发送到服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21720088/

相关文章:

c++ - 在 32 位 Linux 上编译代码时出现未声明错误 'gtk_window_set_keep_above'

c - 二叉树前序遍历只打印 NULL

linux - 在 Unix 中别名查找目录

c++ - 最佳实践 : Sending typed data over TCP

security - 使用 AES-256-CBC 与 block 加密的文件加密

c - 输入错误时如何显示错误信息?

c - syscalls.h 中的 sys_ 函数未定义

当应用程序使用 poll() 而不是 linux 中的 epoll() 时,调用被路由到驱动程序

linux - 为什么在主机挂载上使用纯数据容器?

java - Java 套接字延迟 30 秒?