Linux傳送結構體

2021-07-25 20:57:06 字數 2929 閱讀 1117

linux網路通訊 linux下多客戶端聊天軟體 linux程式設計 linux socket send and recevie structure

最近在開發乙個linux下的聊天軟體,好久沒有做c語言的開發了,感覺到很多東西已經生疏了,這下又碰到用socket傳遞結構體的問題,google了一下,發現也有不少朋友遇到同樣的問題,所以就打算寫出自己的解決辦法,跟大家分享。

socket中的send函式可以傳送字串,但不能直接傳送結構體,因此在傳送端先把結構體轉成字串,然後用send傳送,在接收端recv字串,再轉換成原先的結構體,這個就是解決問題的主要思路,實現中要注意的問題在下文闡述。

為了客戶端之間能夠互相通訊,實現私聊,我採用伺服器**的方式,因此使用者傳送的每條訊息中除了訊息主體外,還必須包含有傳送者、接收者id等資訊,如此採用結構體便是最佳的辦法了。我定義的結構體如下:

雙擊**全選

12

3

4

5

6

7

struct send_info

;

傳送端主要**(為了簡潔說明問題,我把使用者輸入的內容、長度等驗證的**去掉了):

雙擊**全選

12

3

4

5

6

7

8

9

10

11

struct send_info info1; //定義結構體變數

printf("this is client,please input message:");

//從鍵盤讀取使用者輸入的資料,並寫入info1.info_content

memset(info1.info_content,0,sizeof(info1.info_content));//清空快取

info1.info_length=read(stdin_fileno,info1.info_content,1024) - 1;//讀取使用者輸入的資料

memset(snd_buf,0,1024);//清空傳送快取,不清空的話可能導致接收時產生亂碼,

//或者如果本次傳送的內容少於上次的話,snd_buf中會包含有上次的內容

memcpy(snd_buf,&info1,sizeof(info1)); //結構體轉換成字串

send(connect_fd,snd_buf,sizeof(snd_buf),0);//傳送資訊

接收端主要**:

雙擊**全選

12

3

4

5

6

7

8

9

10

11

12

13

14

15

struct send_info clt; //定義結構體變數

memset(recv_buf,'z',1024);//清空快取

recv(fd,recv_buf,1024,0 );//讀取資料

memset(&clt,0,sizeof(clt));//清空結構體

memcpy(&clt,recv_buf,sizeof(clt));//把接收到的資訊轉換成結構體

clt.info_content[clt.info_length]='';

//訊息內容結束,沒有這句的話,可能導致訊息亂碼或輸出異常

//有網友建議說傳遞的結構體中盡量不要有string型別的字段,估計就是串尾符定位的問題

if(clt.info_content) //判斷接收內容並輸出

printf("nclt.info_from is %snclt.info_to is %snclt.info_content is%snclt.info_length is %dn",clt.info_from,clt.info_to,clt.info_content,clt.info_length);

//至此,結構體的傳送與接收已經順利結束了

c/c++通過socket傳送結構可以直接先將結構轉化到記憶體中,再通過send直接傳送。

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

struct usrdata

write(cfg_fd, para, sizeof(hd4100_rec_t));  //hd4100_rec_t是自定義的結構

close(cfg_fd); 

printf("the para which is written to the config file:/n");

read(cfg_fd, &hd4100_config, sizeof(hd4100_rec_t)); //從檔案讀內容到記憶體中

close(cfg_fd);

包含引用型別或值型別的結構或物件無法通過以上方法直接傳送,而必須通過序列化的方式轉化為二進位製流傳送和接收。如c# socket傳送序列化struct示例:

傳資料,下面給乙個傳送struct的例子. 

首先:把struct寫到乙個單獨的類中.編譯成dll 

using system; 

[serializable] 

public struct user_inf 

然後在你的伺服器端和客戶端都新增這個dll. 

下面是伺服器端傳送這個序列化的struct 

while(true) 

一下是client端接收到資料後反序列化 

binaryformatter bf; 

bf = new binaryformatter(); 

user_inf user=(user_inf)bf.deserialize(s);

socket傳送結構體

客套話不說了 socket中的send函式可以傳送字串,不能直接傳送結構體,自己理解 結構體即記憶體中一段連續的記憶體,這樣send中可以傳送結構體指標 上 功能 客戶端傳送給服務端乙個結構體,服務端返回客戶端一字串 客戶端 client.c include include include incl...

socket通訊傳送結構體

socket通訊可以直接傳送結構體!示例 傳送端 c sharp view plain copy struct student struct student student1 接受端 c sharp view plain copy struct student struct student stud...

c c 通過socket傳送結構體

c c 通過socket傳送結構可以直接先將結構轉化到記憶體中,再通過send直接傳送。首先,我們建立乙個結構體。struct usrdata write cfg fd,para,sizeof hd4100 rec t hd4100 rec t是自定義的結構 close cfg fd printf ...