TCP客户端-接收来自未知/无限大小的消息

TCP客户端-接收来自未知/无限大小的消息,c,tcpclient,c99,C,Tcpclient,C99,我目前正在参加一项大学任务,面临着一个我无法解决的问题。我正在开发一个TCP客户端,它连接到一个服务器并从那里获取消息 客户端应该能够处理任意长度的字符串,并输出所有接收到的字符,直到服务器关闭连接 我的客户端可以工作,并且具有固定的字符串长度,我还可以从例如djxmmx.net端口17接收消息。然而,我不知道如何映射这个任意长度 我的C语言知识真的很差,这就是为什么我需要一些关于如何实现我的问题的建议、想法或技巧 实际这是我接收消息的代码: // receive data from the s

我目前正在参加一项大学任务,面临着一个我无法解决的问题。我正在开发一个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
指示套接字已有序关闭()。可能看起来像这样:

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[] */
}

你说‘TCP’;我相信你的话,这不是UDP。(规则变了!)。一个方面是,您需要从返回值捕获接收消息的实际长度:
int length=recv(…)。对于其余的部分,如果您只需要阅读一条消息,那么您就可以迭代地
recv()
,直到EOF。如果在每个方向上都有多条消息,那么您必须知道消息边界在哪里。是的,它是tcp(SOCK_STREAM)。和整数长度。。。对我来说是有意义的,但是我如何使用recv(int-sockfd、void*buf、size\u t len、int-flags);没有尺寸透镜?这是长度还是我错了?谢谢你指出这一点。在“步骤”中接收对我来说是可以的,到目前为止也很有效,但我无法动态地构建字符串。不客气,很高兴它有效。如果你认为答案是好的,请随意将答案标记为“已接受”,并投票表决。动态内存管理确实有用,但需要正确完成。你需要创建一个空间来放置你的数据,如果空间被填满,要么a)让空间变大,要么b)找到一个新的、更大的空间,并将现有数据移动到其中。已经有一些问题了:试着把它做好,如果你需要帮助,在这里再问另一个问题。祝你好运非常感谢你。与此同时,我发现了一个很好的教程,我的客户现在正在做它应该做的事情。