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型???想想先,想想先,不着急。
答案在上一篇筆記。