无线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部分不变而得到*/

评论