Linux socket之三:面向不需連線的socket通訊&&sokcet逾時處理

來源:互聯網
上載者:User

(1)不需連線的socket通訊相對於有串連的socket通訊較為簡單,因為在傳輸過程中不保證能否到達,常用於對資料要求不高的地方。由於省去了很多開銷,它的傳輸速度比有串連的socket通訊要快,使用UDP傳輸資料。資料通訊如下:

                                                                      

如上,服務端在綁定socket到指定的IP和連接埠後,並沒有使用listen()來監聽串連,也沒有使用accept對新的請求建立串連,因為沒有串連的概念。

        不需連線的socket通訊端通訊,發送和接收資料的函數跟連線導向的通訊端通訊不同,使用recvfrom()函數和sendto()函數,定義如下:

int recvfrom(int s,void *buf,size_t len,int flags,struct sockaddr *from,socklen_t *fromlen);//用來從指定的IP和連接埠接收資料

int sendto(int s,const void *msg,size_t len,int flags,const struct sockaddr *to,socklen_t *tolen);  //用來向指定的連接埠發送資料

不需連線的通訊端可以在同一個socket與不同的IP和連接埠收發資料,可以在伺服器端管理不同的串連。

(2) 由於網路通訊中存在很多不確定的因素,因此資料的傳輸不可能每次都正確,需要對資料發送和接收做逾時處理。如果超過這個時間沒有得到反饋,認為資料轉送失敗,socket提供了setsockopt()和getsockopt()用來設定通訊端和得到通訊端參數。

          原型分別是:

int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);

int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);

參數s是通訊端控制代碼;level指定不同的協議,目前僅有SOL_SOCKET和IPPROTO_TCP兩個協議;optname是通訊端參數名稱;optval是一個指向timeval結構的指標,可以用這個表示逾時等待的時間長度。

        一個執行個體如下:

struct timeval time_out;time_out.tv_sec = 5;time_out.tv_usec = 0;//設定逾時時間5秒setsockopt(s,IPPROTO_TCP,SO_RCVTIMEO,&time_out,sizeof(time_out));//設定接收資料逾時setsockopt(s,IPPROTO_TCP,SO_SNDTIMEO,&time_out,sizeof(time_out));//設定發送資料逾時

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.