我有一个TCP服务器和客户端,并带有已建立的套接字。比方说,我有以下情况:分别通过TCP套接字发送和接收字符串
SERVER:
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)我应该发送()和recv()或者?在我的代码的其他部分,似乎它是自我调节的,只在正确的时间接收正确的字符串,而不必检查。这是否有诀窍?
3)关于发送一个包含我将要发送的字符串长度的头部,我如何解析传入的字符串以知道在哪里分割?任何例子都会很棒。
4)我一定会检查一下,如果我得到的东西比我的缓冲区大,谢谢指出。
编辑2:
5)因为我总是把事情大小的缓冲区字符数组512不应该每次发送操作把缓冲区的全尺寸即使我发送1个字母串?这是令人困惑的。我有“约翰”,但我把它放在一个大小为512的数组中,发送它,不应该填满发送缓冲区,所以recv()函数会清空网络缓冲区,同时拉动整个数组的大小512?
你跳过写一个客户机/服务器应用程序的非常拳头一步 - 设计客户端和服务器用于交换信息的协议。如果你从来没有设计过一个协议,那么你就不能实现一个协议,然后你的代码只能运行,如果它工作的话,那么运气好。显然你想发送消息,但TCP不是消息协议。那么你使用的是什么消息协议? –