目录
UDP多点通信
广播
理论
发送端--相当于udp客户端
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
// 1.创建套接字
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0)
{
perror("创建套接字失败\n");
return -1;
}
// 2.允许发送广播
int flag = 1;
socklen_t len = sizeof(flag);
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &flag, len);
// 3.填充结构体
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(8888);
saddr.sin_addr.s_addr = inet_addr("192.168.50.255");
socklen_t addrlen = sizeof(saddr);
#define N 64
char buf[N];
while (1)
{
memset(buf, 0, N);
printf("请输入要输入的数据:");
scanf("%s", buf);
getchar();
sendto(sockfd, buf, N, 0, (struct sockaddr *)&saddr, addrlen);
}
close(sockfd);
return 0;
}
接收端--相当于udp服务器
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
// 1.创建套接字
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0)
{
perror("创建套接字失败\n");
return -1;
}
// 2.bind绑定IP和Port端口号
struct sockaddr_in saddr, caddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(atoi(argv[1]));
saddr.sin_addr.s_addr = inet_addr("0.0.0.0");
socklen_t addrlen = sizeof(saddr);
if (bind(sockfd, (struct sockaddr *)&saddr, addrlen) < 0)
{
perror("bind失败");
return -1;
}
printf("bind成功\n");
// 3.接收消息
#define N 64
char buf[N];
while (1)
{
int ret = recvfrom(sockfd, buf, N, 0, (struct sockaddr *)&caddr, &addrlen);
if (ret < 0)
{
perror("接收消息失败\n");
close(sockfd);
return -1;
}
else
{
printf("客户端ip:%s:%s\n", inet_ntoa(caddr.sin_addr), buf);
}
}
close(sockfd);
return 0;
}
组播
理论
发送端
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
// 1.创建套接字
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0)
{
perror("创建套接字失败\n");
return -1;
}
//2.填充结构体
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(8888);
saddr.sin_addr.s_addr = inet_addr("224.0.0.3");
socklen_t addrlen = sizeof(saddr);
#define N 64
char buf[N];
while (1)
{
memset(buf, 0, N);
printf("请输入要输入的数据:");
scanf("%s", buf);
getchar();
sendto(sockfd, buf, N, 0, (struct sockaddr *)&saddr, addrlen);
}
close(sockfd);
return 0;
}
接收端
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
// 1.创建套接字
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0)
{
perror("创建套接字失败\n");
return -1;
}
// 加入多播组
struct ip_mreq mreq;
// bzero(&mreq, sizeof(mreq));
mreq.imr_multiaddr.s_addr = inet_addr("224.0.0.3");
mreq.imr_interface.s_addr = INADDR_ANY;
setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
struct sockaddr_in saddr, caddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(atoi(argv[1]));
saddr.sin_addr.s_addr = inet_addr("0.0.0.0");
socklen_t addrlen = sizeof(saddr);
if (bind(sockfd, (struct sockaddr *)&saddr, addrlen) < 0)
{
perror("bind失败");
return -1;
}
printf("bind成功\n");
// 3.接收消息
#define N 64
char buf[N];
while (1)
{
int ret = recvfrom(sockfd, buf, N, 0, (struct sockaddr *)&caddr, &addrlen);
if (ret < 0)
{
perror("接收消息失败\n");
close(sockfd);
return -1;
}
else
{
printf("客户端ip:%s:%s\n", inet_ntoa(caddr.sin_addr), buf);
}
}
close(sockfd);
return 0;
}