1.创建对象
int udp_socket = socket(AF_INET,SOCK_DGRAM,0);
AF_INET 网络通信协议
SOCK_DGRAM 传输协议
属性默认 0
2.想接收信息就需要绑定地址信息
struct sockaddr_in clien_addr; //可以获取发送端信息
int len=sizeof(clien_addr);
recvfrom(udp_socket,buf,1024,0,(struct sockaddr *)&clien_addr,&len);
如不需要获取发送端信息就
recvfrom(udp_socket,buf,1024,0,NULL,NULL);
4.发送信息
(需要接收端的信息才能发送,设置发送结构体)
struct sockaddr_in dest_addr;
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(3021);
dest_addr.sin_addr.s_addr = INADDR_ANY; //或 inet_addr("192.168.64.183") 根据具体网址
sendto(udp_socket,buf,strlen(buf),0,(struct sockaddr *)&dest_addr,sizeof(dest_addr));
5.关闭
close(udp_socket);
udp 开启组播
(组播相当于开启群聊)
1.创建对象
struct ip_mreq a; //组播结构体
bzero(&a, sizeof(a));
a.imr_interface.s_addr = INADDR_ANY; //所有网卡地址加入组播
a.imr_multiaddr.s_addr = inet_addr("224.10.10.10"); // 指定多播地址
setsockopt(udp_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, &a, sizeof(a));
4.接收与发送
recvfrom(udp_socket,buf,1024,0,NULL,NULL); // 还是直接用udp对象就可以接收
struct sockaddr_in arry_addr; // 将发送到对象的结构体
arry_addr.sin_family=AF_INET;
arry_addr.sin_port=htons(8888);
arry_addr.sin_addr.s_addr=inet_addr("224.10.10.10");
sendto(udp_socket,buf,strlen(buf),0,(struct sockaddr *)&arry_addr,sizeof(arry_addr));
(需注意设置结构体需要与绑定对象的端口相同,网址为设置组播的网址)
1.创建对象
int on=1; //开启
setsockopt(udp_socket,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
3.发送广播信息
struct sockaddr_in dest_addr;
dest_addr.sin_family=AF_INET; //设置网络协议
dest_addr.sin_port=htons(6666); //所有处于当前网段且,端口为 6666 的进程都可以收到数据
//即192.168.64网段的都能收到
dest_addr.sin_addr.s_addr=inet_addr("192.168.64.255"); //设置广播地址
sendto(udp_socket,"hello",5,0,(struct sockaddr *)&dest_addr,sizeof(dest_addr));