成功實現Linux下Socket編程中用send發送結構體

成功實現LinuxSocket編程中用send發送結構體

轉載請註明 本文引用地址: http://blog.csdn.net/xl_xunzhao/archive/2008/10/27/3156864.aspx 

 

關鍵字:Linux環境下Socket編程 Socket發送/傳送結構體 Socket編程 send

Linux網絡通信 Linux下多客戶端聊天軟件 Linux程序設計 Linux socket send and recevie structure

 

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

  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]='/0' //消息內容結束,沒有這句的話,可能導致消息亂碼或輸出異常 //有網友建議說傳遞的結構體中儘量不要有string類型的字段,估計就是串尾符定位的問題

if(clt.info_content) //判斷接收內容並輸出 printf("/nclt.info_from is %s/nclt.info_to is %s/nclt.info_content is%s/nclt.info_length is %d/n",clt.info_from,clt.info_to,clt.info_content,clt.info_length); //至此,結構體的發送與接收已經順利結束了

感謝:http://www.itzhe.cn/news/20080928/237256.html

本文引用地址: http://blog.csdn.net/xl_xunzhao/archive/2008/10/27/3156864.aspx 

 

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