(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));//設定發送資料逾時