【轉】socket不能直接傳輸結構體!


  1. typedef struct
  2. {
  3. char name[20];
  4. char age[10];
  5. } stu;
  6. 發送方:
  7. ..............................
  8. stu stu1;
  9. strcpy(stu1.name, "myname");
  10. strcpy(stu1.age, "30");
  11. send(sock, (char*)stu1,sizeof(stu1), 0);
  12. 接受方:
  13. ..............
  14. recv(socka, rbuf, readlen, 0); //rbuf足夠大
  15. stu *stu1;
  16. stu1 = (stu*)buff;
  17. printf("myname=%s, myage=%s/n", stu1->name, stu1->age);

輸出 myname, 但stu1->age為空,沒有取到。

 

你能保證發送方和接收方永遠都是同樣的機器同樣的系統嗎?如果不能,就不要直接傳結構

 

TCP傳輸是基於流的,最好按照下面方法了定義結構
struct msg_struct{
unsigned int msg_len;
/*下面是具體的信息,可能是其它的結構,便於擴展*/
/*.......*/ 
}

發送端要計算msg_len的值
接收端要先接收sizeof(unsigned int)個字節,得到msg_len,然后recv(..,msg_len..)

 

你的msg_len傳過去有用么?對方知道你是什么endian?

 

 

俺以前做過一個項目,改造國內一個著名的系統,其中的一部分就是原設計愚蠢地在CS間使用結構進行數據傳輸,遇到big-denian就瞎了,結果俺想了一招,做了一個通用的轉換器解決了問題,省去了上千個應用程序的修改。

所以,網絡上的數據傳輸絕對禁止使用帶有2進制的結構數據,因為你不知道以后會出現什么樣的機器使用什么樣的體系,但是ASCII是不會改變的,除非你本就沒想讓自己的成果的生命期變得長久。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM