我有一个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()上卡住了...因为我已经发送完毕。
我尝试了以下方法: - 像这样为fn和ln字符串添加\0:
char *fn = "John\0";
char *ln = "Doe\0";
但问题仍然存在。
我是否可以施加某种条件,使得每个字符串都单独接收?
编辑以添加更多问题:
1)为什么在某些情况下它实际上会将它们分开发送,而在其他情况下会同时发送它们?
2)我应该交替使用send()和recv()吗?在我的代码的其他部分中,它似乎是自我调节的,只有在正确的时间接收正确的字符串,而无需检查。这样做可以解决问题吗?
3)关于发送带有要发送的字符串长度的标头,如何解析传入的字符串以知道在哪里拆分?有任何示例将非常好。
4)我一定会检查是否正在获取比我的缓冲区更大的内容,感谢您指出这一点。
编辑2:
5)由于我总是将事物放在大小为512的缓冲字符数组中。即使我发送一个1字母字符串,每个send操作也应该占用整个缓冲区的大小,对吗?这就是困惑的地方。我有“John”,但我将其放入大小为512的数组中并发送它,那不应该填满发送缓冲区,因此recv()函数通过还取整个大小为512的数组来清空网络缓冲区吗?