UDP通信不存在TCP一样的“三次握手的情况”,在视屏采集与传输采用UDP的传输协议速度上也优于TCP。那么UDP是如何实现通信的呢?
服务器端:
struct sockaddr_in sin; //服务器本机使用的地址信息
struct sockaddr_in cin; //用于接收客户端的地址信息
bzero(&sin , sizeof(sin)); //填写地址结构
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(PORT_V4L2_SEND);
s_fd = socket(AF_INET,SOCK_DGRAM,0); /*创建套接字*/
if(s_fd == -1)
{
perror("error: fail to creat socket");
exit(1);
}
if(bind(s_fd,(struct sockaddr *)&sin,sizeof(sin)) == -1) /*绑定套接字*/
{
perror("error: call to bind");
exit(1);
}
addr_len = sizeof(cin);
n = recvfrom(s_fd,recvbuf,RECVBUF_MAX_SIZE,0,(struct sockaddr *)&cin,&addr_len); //接收客户端传来的地址信息并存储在cin中
if(n == -1)
{
perror("fail to receive/n");
exit(1);
}
(recvfrom是阻塞的,也就是如果没有客户端来向服务器发送信息则服务器代码会一直阻塞在recvfrom这一步。)
。。。
n=sendto(s_fd,ptcur,n,0,(struct sockaddr *)&cin,sizeof(cin));
if(n == -1)
{
perror("error: send fail!");
exit(1);
}
(recvfrom成功后就是用cin中存放的客户端信息向客户端发送数据。)
客户端:
struct sockaddr_in sin;
struct sockaddr_in cin;
bzero(&sin , sizeof(sin));
sin.sin_family = AF_INET; //填写服务器信息
sin.sin_port = htons(PORT_V4L2_RECEIVE);
inet_pton(AF_INET,"192.168.1.223",&sin.sin_addr);
addr_len = sizeof(cin);
c_fd = socket(AF_INET,SOCK_DGRAM,0);
if(c_fd == -1)
{
perror("error: fail to creat socket");
exit(1);
}
n = sendto(c_fd,buf,MAX_SIZE,0,(struct sockaddr *)&sin,sizeof(sin)); //向sin地址(服务器)结构发送buf缓冲包含的内容
if(n == -1) //这一步是为了将客户端的地址结构发送个服务器,让服务器接收
{
perror("error: sendto sin failed!");
exit(1);
}
n = recvfrom(c_fd,buf,MAX_SIZE,0,(struct sockaddr *)&cin,&addr_len);
if(n == -1)
{
perror("error: fail to recive");
exit(1);
}
(这里的cin存储着服务器的地址信息)