scoket傳輸結構體

      socket只能只能發送char *類型的,剛用的時候就就是頭痛。

     下面介紹一種能直接傳輸結構體的小方法,但是先說明,不能傳指針的,原因後面探討一下。 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  主要思想系:由於結構體對象在內存中分配的空間都是連續的,所以可以將整個結構體直接轉化成字符串發送,到了接收方再將這個字符串還原成結構體就大功告成了。

  首先,我們建立一個結構體。

  struct Student{

  char name[16];

int age;

  };

  //注意,這個結構體在發送方與接收方都必須聲明。

  //接下來創建對象並初始化,然後發送。

Student student;賦值之類的;

     send( m_socket, (char *)&student, sizeof(student), 0 );

  這樣發送方就已經將這個student對象以字符串的形式發送出去了。

  最後在接收方做接收。

  char buffer[1024];

  recv( m_socket, buffer, sizeof(buffer), 0 );

Student stu;

  memcpy( &stu, buffer, sizeof(buffer) );

  這樣就可以了。具體原因其實很簡單,就是因爲結構體對象的內存區域連續,同時每個成員的區塊大小都分配好了,當接收完自己的區塊,其實自己的數據已經接收完成。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

但是,注意,指針在結構體裏面是傳輸不了的,爲什麼不可以呢?

想想,指針是幹嘛的?指針存的是一個地址,那個地址上面的東東纔是我們真正要處理的數據。

網絡傳輸,其實就是個快遞員,只是把數據不變的傳輸過去,不管裏面是什麼的。傳到接收端,沒錯,指針的內容(一個地址)接收到了,但是接收端在該指針指向的地址上並沒有預期的數據啊(就是剛剛說的東東了)。所以,運行的時候就會出錯。

by the way ,出錯了還好,知道程序有bug,不出錯的話,那個指針已經是野指針了,什麼時候弄出bug玩死自己了。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

比較一般的做法系,預先告訴接收端數據包的長度,讓接收端按這個長度來接受數據,重組。

怎麼發送數據包的長度??其實這個問題的核心繫,怎麼將int 或者long int轉換成char型???想想先,想想先,不着急。

答案在上一篇筆記。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章