gpt4 book ai didi

c - 分别通过 TCP 套接字发送和接收字符串

转载 作者:可可西里 更新时间:2023-11-01 02:32:20 25 4
gpt4 key购买 nike

我有一个 TCP 服务器和客户端,带有已建立的套接字。假设我有以下情况:

服务器:

char *fn = "John";
char *ln = "Doe";

char buffer[512];

strcpy(buffer, fn);
send(*socket, buffer, strlen(buffer), 0);
strcpy(buffer, ln);
send(*socket, buffer, strlen(buffer), 0);

客户:

char *fn;
char *ln;

char buffer[512];

bytes = recv(*socket, buffer, sizeof(buffer), 0);
buffer[bytes] = '\0';
strcpy(fn, buffer);

bytes = recv(*socket, buffer, sizeof(buffer), 0);
buffer[bytes] = '\0';
strcpy(ln, buffer);

printf("%s", fn);
printf("%s", ln);

预期结果:我想分别接收每个字符串(因为我将它们保存在不同的变量中),而不是第一个 recv() 获取 fn“John”和 ln“Doe”连接的“JohnDoe”,并且程序卡在第二个 recv ()...因为我已经完成了发送。

我尝试了以下方法: - 像这样将\0 添加到 fn 和 ln 字符串中:

char *fn = "John\0";
char *ln = "Doe\0";

但问题依然存在。

我可以施加某种条件以便单独接收每个字符串吗?

编辑以添加更多问题:

1)为什么有的时候是分开发,有的时候是 union 发?

2) 我应该交替使用 send() 和 recv() 吗?在我的代码的其他一些部分,它似乎是 self 调节的,并且只在正确的时间接收正确的字符串而无需我检查。这能解决问题吗?

3) 关于发送包含我将要发送的字符串长度的 header ,我如何解析传入的字符串以了解在何处拆分?任何例子都会很棒。

4) 我肯定会检查我是否得到了比我的缓冲区更大的东西,感谢您指出它。

编辑 2:

5) 因为我总是把东西放在大小为 512 的缓冲区字符数组中。即使我发送的是 1 个字母的字符串,难道每个发送操作都不应该占用缓冲区的全部大小吗?这就是令人困惑的。我有“John”,但我将它放在一个大小为 512 的数组中并发送它,这不应该填满发送缓冲区,因此 recv() 函数通过拉取整个大小数组来清空网络缓冲区512?

最佳答案

首先,当客户端调用recv(*socket, buffer, sizeof(buffer), 0);时,它会收到最多个sizeof(buffer)个字符(此处,512) 来自网络。这是来自网络缓冲区,与在服务器上调用 send 的次数无关。 recv 不会查找 \0 或任何其他字符 - 它是从网络缓冲区中提取的二进制文件。它将读取整个网络缓冲区或 sizeof(buffer) 个字符。

您需要检查第一个 recv 以查看它是否同时具有名字和姓氏并适本地处理它。

您可以让服务器将字符串的长度作为流的前几个字节(“ header ”)发送,或者扫描接收到的数据以查看是否有两个字符串。

您确实需要在每次调用 recv 时执行检查 - 如果字符串超过 512 字节怎么办?然后你需要多次调用 recv 来获取字符串。如果你得到第一个字符串,而第二个字符串只有一半怎么办?通常这两种情况只在处理大量数据时才会发生,但我以前在自己的代码中看到过这种情况,所以即使在处理像这样的小字符串时,最好也对 recv 进行良好的检查这个。如果您及早练习良好的编码策略,您以后就不会遇到那么多令人头疼的问题。

关于c - 分别通过 TCP 套接字发送和接收字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13656702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com