send函式可以直接傳送結構體嗎?

2021-07-29 16:44:02 字數 1720 閱讀 5865

網路通訊程式設計中,常常用結構體對待傳送的資料進行封裝。比如,

struct msg ;

cmd表示命令,遠端會根據cmd進行不同的處理;extradata是要傳送的陣列;len則表示extradata的占用的記憶體位元組數。

在這種設計下,當需要傳送資料時,把根據資料長度增加整個struct msg的記憶體(一般是定義struct msg指標,然後用realloc函式重新分配),然後把待傳送資料填入extradata指向的記憶體單元(就是新增加的記憶體單元)。再把資料長度填入len,命令填入cmd。

struct msg  *clientmsg = (struct msg *)malloc(sizeof(structmsg));

clientmsg->cmd =cmd_compute;

clientmsg->len = 12;

clientmsg = (struct msg *)realloc(clientmsg, sizeof(struct msg) + 12 );

*(clientmsg->extradata) =11;

*(clientmsg->extradata + 1) = 22;

*(clientmsg->extradata + 3) = 33;

那麼,send函式的第二個引數能否填該結構體的位址呢?

send函式原型為:

ssize_t send(int sockfd, const void*buf, size_t len, int flags)

其意義是傳送buf指向的記憶體的連續的len個位元組單元。結構體的位址實質是一塊連續記憶體單元的首位址,那麼將其填在此處是符合邏輯的。

然而,考慮到結構體的記憶體分布(參考本人另一篇部落格《struct記憶體對齊》),乙個結構體的記憶體中很有可能存在無效的位元組。64位cpu中,msg結構體在記憶體中的分布為     

資料:|-----------data[1]----------|  |-----------data[2]----------|

占用單元數:        4                     4

資料:|cmd| |len|   |無效位元組|  |--------data[0]----------|

占用單元數:  1     1        2            4

位址0x02-0x03為無效位元組。如果將&data和sizeof(struct data)填入send函式,傳送的將是從0x0到0xb的記憶體單元,包含了無效位元組。

基於傳送端對傳送資料的操作,遠端接收資料時,必須先拿到len值,然後根據該值增加extradata指向的記憶體單元個數,才能接收資料。

struct msg  *clientmsg = (struct msg *)malloc(sizeof(structmsg));

recv(sockfd, clientmsg,sizeof(struct msg));//此處取得cmd=cmd_compute和len =12

clientmsg = (struct msg *)realloc(clientmsg, sizeof(struct msg) + clientmsg->len );//根據len值增加記憶體

recv(sockfd, clientmsg->extradata,clientmsg->len);//接收extradata,此時會把傳送端記憶體位址為0x02到0x0d的12個位元組接收過來,然而,0x02到0x03為無效位元組,且有效位元組0x0e-0x0f沒有被接收。

綜上所述,在此種情況下,傳送結構體時不可直接填入其位址。

資訊傳送函式send

資訊傳送函式send 用connect函式連線到遠端計算機以後,可以用send函式將資訊傳送到對方的計算機。這個函式的使用方法如下所示。int send int s,const void msg,int len,unsigned int flags 在引數列表中,s表示已經建立的socket,msg...

c語言結構體可以直接賦值

from 下面是乙個例項 include struct foo foo1,foo2 define two structs with three different fields void struct assign void int main 我在ubuntu 13.04下使用gcc 4.7.3 編...

c語言結構體可以直接賦值

下面是乙個例項 include struct foo foo1,foo2 define two structs with three different fields void struct assign void int main 我在ubuntu 13.04下使用gcc 4.7.3 編譯執行得到...