c - TCP 客户端 - 从未知/无限大小接收消息

标签 c tcpclient c99

我目前正在完成一项大学任务,并且面临一个无法为我解决的问题。我正在开发一个连接到服务器并从那里获取消息的 TCP 客户端。

客户端应该能够处理任何长度的字符串并输出所有接收到的字符,直到服务器关闭连接。

我的客户端可以正常工作,并且字符串长度固定,我也可以从例如djxmmx.net 端口 17。但是,我不知道如何映射这个任意长度。

我的 C 知识真的很差,这就是为什么我需要一些关于如何实现我的问题的建议、想法或技巧。

实际上这是我接收消息的代码:

// receive data from the server
    char server_response[512];
    recv(client_socket, &server_response, sizeof(server_response), 0);

最佳答案

如果您要处理基本上无限长度的输入,则需要在循环中多次调用 recv() 以获取输入的每个后续部分。如果您可以一次处理每个部分,然后丢弃它并转到下一个部分,这是一种方法。如果您需要一次性处理所有输入,您将不得不找到一种存储任意大量数据的方法,可能使用动态内存分配。

使用 recv(),您可能希望循环读取内容,直到它返回 0,表示套接字已执行有序关闭 (documentation here)。这可能看起来像这样:

char server_response[512];
ssize_t bytes_read;
while ((bytes_read = recv(client_socket, &server_response,
                          sizeof(server_response), 0)) > 0) {
  /* do something with the data of length bytes_read
     in server_response[] */
}

关于c - TCP 客户端 - 从未知/无限大小接收消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53124315/

相关文章:

java - 编写 Java TCP 客户端(C# 服务器)的最佳方式是什么?

javascript - 相当于 : echo 'message' | nc -v <server> <port> 的 Node.js

c - 最好的未定义行为,是边界中断吗? - 错误的指针算术?或者只是 -ignore 别名?

c - C 中的 block 语句、逗号和控制表达式

c - 在 C 中循环退出后使用 'for' 循环迭代器

c - 将指针向下传递给三个嵌套函数

c - 将文件中的信息加载到c中的列表中

c - 单元测试实际过程

c# - TCPClient 异步/等待 C#

C数组在一定范围内反转