無線VoIP系統IP通話功能實現
(1)雙方分別建立socket,調用socket函數:
s=socket(PF_INET,SOCK_DGRAM,0)
SOCK_DGRAM表示套接字類型為數據報套接字,即采用UDP協議進行通信。
(2)綁定已設置好的自己的地址和端口信息,調用bind函數:
bind(s,(struct sockaddr*)my_addr,sizeof(structsockaddr))
(3)將select函數置于阻塞狀態,直到監視文件描述符集合rfds中某個文件描述符發生變化為止:
select(pCtrl->rwd+1,rfds,IFX_NULL,IFX_NULL,NULL)
(4)數據傳輸:sendto()和recvfrom()用于在無連接的數據報socket方式下進行數據傳輸。由于本地socket并沒有與遠端機器建立連接,所以在發送數據時應指明目的地址。如圖6所示,A作為發送方,通過其套接字用函數sendto()將其服務請求數據發送到接收方B的指定端口,B通過其套接字用函數recvfrom()接收數據,處理好服務請求后又將服務應答發回A,此時A便成了接收方,A接收應答后還可繼續發送數據給B。
2.2 廣播通訊的實現
廣播和多播都用于實現向多個接收者發送UDP數據報,但是廣播不像多播那樣在接收端有復雜的控制過程,因而實現比多播簡單的多。以下廣播通訊的實現均在點對點通訊的基礎上實現的。
在發送方,只需要設置套接字socket的選項為允許發送廣播,然后在發送時指定目的IP為廣播地址即可。具體地,允許socket廣播通過setsockopt函數設置廣播選項來實現,當setsockopt參數optname為SO_BROADCAST時,表示打開或禁止從該socket廣播,當參數optval為1時允許廣播,為0時禁止廣播。
系統編程實現廣播的部分源碼為:
int bBroadcast=1:
setsockopt(pCtrl-->nAdminSocket,SOL_SOCKET,SO_BROADCAST,bBroadcast,sizeof(bBroadcast));
setsockopt(pConn-->nUsedSocket,SOL_SOCKET,SO_BROADCAST,bBroadcast,sizeof(bBroadcast));
tO_addr.sin_addr.s_addr=inet_addr(WIRLESS_IP_BROADCAST);
/*WIRLESS_IP_BROADCAST為廣播地址,其值是將網絡接口(本系統為ath0)IP地址的主機ID部分設置為全1,網絡ID部分不變而得到*/

評論