我有一个 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)为什么在某些情况下实际上是分开发送的,而其他情况下是联合发送的?
2)我应该 send() 和 recv() 交替吗?在我的代码的其他一些部分,它似乎是自我调节的,并且只在正确的时间接收正确的字符串,而无需我检查。这行得通吗?
3)关于发送一个带有我即将发送的字符串长度的标题,我如何解析传入的字符串以知道在哪里拆分?任何例子都会很棒。
4)我一定会检查我是否得到比我的缓冲区更大的东西,谢谢你指出它。
编辑2:
5) 因为我总是把东西放在大小为 512 的缓冲区字符数组中。即使我发送 1 个字母的字符串,每个发送操作是否不应该占用缓冲区的全部大小?这就是令人困惑的地方。我有“John”,但我将它放在一个大小为 512 的数组中并发送它,这不应该填满发送缓冲区,因此 recv() 函数还通过拉取整个数组大小来清空网络缓冲区512?