UDP傳輸模式是數據報,TCP傳輸模式為字節流,字節流與數據報區別在於有邊界與無邊界。例如:TCP客戶端發送了三個數據包,開的緩存足夠大服務端一次可接收三個數據包的數據,這就是無邊界。UDP客戶端發送了三個數據包,就算開的緩存足夠大服務端一次也只能接收一個數據包,這就是有邊界。
還有就是協議會維護源地址和目的地址直到協議要求斷開連接,這就決定了TCP不能進行廣播和多播。
如何使用TCP發送結構體類型數據:
· //使用結構體轉換成字符串發送,在服務器端直接轉為結構體
· /*
· char send_buf[1024] = "tony 2000 ";
· memset(send_buf,0,1024);
· struct msg
· {
· int cmd;
· int sendID;
· int recvID;
· string name;
· int number;
· };
· msg msg1;
· msg1.cmd = COMMAND;
· msg1.sendID = 2120100324;
· msg1.recvID = 2120100325;
· msg1.name = "Tony";
· msg1.number = 2000;
·
·
· //以字符串形式發送,因為TCP/IP是字節流通信
· //memcpy(send_buf,&msg1,sizeof(msg));
· //int len_send = send(Socket,send_buf,sizeof(send_buf),0);
· int len_send = send(Socket,(char *)&msg1,sizeof(msg),0);
如上所示,
TCP是無邊界的字節流傳輸,所以需要將結構體轉換為字符串后在發送,最后三行用了兩種方法發送屬於結構體類型的數據,通過TCP傳輸。最后在接收方需要轉換為結構體。
紅色: 數組屬於字符串,該方法是將要發送結構體所占字節大小考到數組中, 再通過數組發送。
藍色: 將該結構體地址轉化為char* 類型的地址,目的是使該指針加1移動時 是按一個字節移動,而不是加1按該結構體大小移動,然后發送該結構 體所占字節大小。
