UDP
1,简介
UDP 为用户数据包协议,它的头为8byte数据;分别为16bit源端口号,16bit目的端口号,16bit长度,16bit校验和;它为无连接,主要用于视频传输相关的应用;因为
客户比较关注实时性; 它不需像TCP 那样,在发送数据前需建立连接;
2,基于udp 广播的client server端实例:
client:
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <linux/if.h>
#include <sys/ioctl.h>
#include <errno.h>
#define DDPAI_FOUND "DDPAI_FOUND"
#define DDPAI_FOUND_ACK "DDPAI_FOUND_ACK"
#define IFNAME "wlan0"
#define MCAST_PORT 8888
int main(int argc, char **argv)
{
int socketFd = -1;
int lRtn = -1;
struct sockaddr_in destAddr;
struct sockaddr_in sourAddr;
/*创建数据报套接字*/
socketFd = socket(AF_INET,SOCK_DGRAM,0);
if(socketFd < 0)
{
printf("socket error:%d\n",errno);
return -1;
}
/*设置源地址为本地广播地址*/
bzero(&sourAddr,sizeof(struct sockaddr_in));
sourAddr.sin_family = AF_INET;
sourAddr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
sourAddr.sin_port = htons(MCAST_PORT);
const int broadcastOpt = 1;
/*设置套接字为广播类型*/
lRtn = setsockopt(socketFd,SOL_SOCKET,SO_BROADCAST,(char *)&broadcastOpt,sizeof(broadcastOpt));
if(lRtn < 0)
{
printf("set socket broadcast error:%d\n",errno);
close(socketFd);
return -1;
}
/*设置套接字 发送/接收缓冲区 属性*/
const int nSendBuf = 0;
lRtn = setsockopt(socketFd,SOL_SOCKET,SO_SNDBUF,(char *)&nSendBuf,sizeof(int));
if(lRtn < 0)
{
close(socketFd);
printf("setsockopt SO_SNDBUF error\n");
return -1;
}
const int nRcvBuf = 0;
lRtn = setsockopt(socketFd,SOL_SOCKET,SO_RCVBUF,(char *)&nRcvBuf,sizeof(int));
if(lRtn < 0)
{
close(socketFd);
printf("setsockopt SO_RCVBUF error\n");
return -1;
}
int lSize = sizeof(destAddr);
fd_set rFdSet;
struct timeval tv;
sleep(1);
int idx = 0;
for(idx = 0; idx < 5; idx++)
{
lRtn = sendto(so