Linux下Socket編程中用send發送結構體

來源:互聯網
上載者:User

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

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

struct send_info

{

char info_from[20]; //寄件者ID

char info_to[20]; //接收者ID

int info_length; //發送的訊息主體的長度

char info_content[1024]; //訊息主體

};

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

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);//發送資訊

接收端主要代碼:

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);

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.