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.创建对象
int
udp_socket
=
socket
(
AF_INET
,
SOCK_DGRAM
,
0
);
2.绑定对象
struct
sockaddr_in server_addr
;
server_addr
.
sin_family
=
AF_INET
;
server_addr
.
sin_port
=
htons
(
端口
);
server_addr
.
sin_addr
.
s_addr
=
INADDR_ANY
;
//
所 有网卡地址
bind
(
udp_socket
,(
struct
sockaddr
*
)
&
server_addr
,
sizeof
(
server_addr
));
3.加入组播
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));
struct
ip_mreq
{
struct
in_addr imr_interface
;
/*
需要加入组 播的IP
地址
*/
struct
in_addr imr_multiaddr
;
/*
组播地址 (D
类地址)
*/
};
D
类地址
:
224.0
.
0.1
~
239.255
.
255.255
//
组播结构体
struct
in_addr
{
in_addr_t s_addr
;
};
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));
(需注意设置结构体需要与绑定对象的端口相同,网址为设置组播的网址)
udp广播
1.创建对象
int
udp_socket
=
socket
(
AF_INET
,
SOCK_DGRAM
,
0
);
2.开启广播(即设置为广播属性)
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));