我有一個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不是消息協議。那麼你使用的是什麼消息協議? –