广播地址
5.关闭套接字
该实例程序一端负责向广播地址上发送消息,一端负责在广播地址上读取消息
消息发送端程序:
#include
#include
#include /* See NOTES */
#include
#include
#include //为了使用 IPV4 地址结构体
#include
#include
#include
//./main ip port
int main(int argc,char *argv[])
{
if(argc != 3)
{
printf("please input ip + port!\n");
return 0;
}
//1.创建一个 UDP 套接字
int sockfd = socket(AF_INET, SOCK_DGRAM,0); //创建一个 IPV4 的数据包套接字
if(-1 == sockfd)
{
perror("create socket failed");
exit(-1);
}
//2.使能广播
int optval = 1;
int ret = setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,(void*)&optval,sizeof(optval)); //设置套接字的属性
if(ret <= 0)
{
perror("setsockopt error");
}
//可以绑定本地的 socket 的地址
//直接发送消息(定义一个接收消息的地址)
struct sockaddr_in addr; //保存接收消息的地址(IP+port)
memset(&addr,0,sizeof(struct sockaddr_in)); //清空结构体
addr.sin_family = AF_INET;
inet_aton(argv[1], &addr.sin_addr);
addr.sin_port = htons(atoi(argv[2]));
char buf[1024] = {"da jia dou shi liang zai!!!"};
while(1)
{
sleep(1);
memset(buf,0,1024);
fgets(buf,1024,stdin);
ret = sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&addr,sizeof(addr)); //发送广播
if(ret <= 0)
{
perror("sendto error");
}
printf("sendto size:%d\n",ret);
}
//关闭套接字
shutdown(sockfd,SHUT_RDWR);
close(sockfd);
return 0;
}
消息读取端程序:
#include
#include
#include /* See NOTES */
#include
#include
#include //为了使用 IPV4 地址结构体
#include
#include
#include
//./main ip port
int main(int argc,char *argv[])
{
if(argc != 3)
{
printf("please input ip + port!\n");
return 0;
}
//1.创建一个 UDP 套接字
int sockfd = socket(AF_INET, SOCK_DGRAM,0); //创建一个 IPV4 的数据包套接字
if(-1 == sockfd)
{
perror("create socket failed");
exit(-1);
}
//2.使能广播
int optval = 1;
int ret = setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,(void*)&optval,sizeof(optval));//设置套接字的属性
if(ret == -1)
{
perror("setsockopt error");
}
//从指定的地址接收消息(定义一个接收消息的地址)
struct sockaddr_in addr; //保存接收消息的地址(IP+port)
memset(&addr,0,sizeof(struct sockaddr_in)); //清空结构体
addr.sin_family = AF_INET;
inet_aton(argv[1], &addr.sin_addr);
addr.sin_port = htons(atoi(argv[2]));
//绑定一个 IP 地址
ret = bind(sockfd,(struct sockaddr *)&addr,sizeof(addr)); //可不绑定
if(ret == -1)
{
perror("bind error");
exit(-1);
}
printf("bind success\n");
char buf[1024] = {0};
struct sockaddr_in send_addr; //用来保存消息发送方的地址
while(1)
{
memset(buf,0,1024);
memset(&send_addr,0,sizeof(struct sockaddr_in)); //清空结构体
socklen_t len = sizeof(send_addr);
ret = recvfrom(sockfd,buf,1024,0,(struct sockaddr*)&send_addr,&len); //接收广播
if(ret <= 0)
{
perror("recv from error");
}
printf("recv size:%d\n",ret);
printf("recv data:%s\n",buf);
}
//关闭套接字
shutdown(sockfd,SHUT_RDWR);
close(sockfd);
return 0;
}
#include
#include
#include /* See NOTES */
#include
#include
#include //为了使用 IPV4 地址结构体
#include
#include
#include
//./main ip port
int main(int argc,char *argv[])
{
if(argc != 3)
{
printf("please input ip + port!\n");
return 0;
}
//1.创建一个 UDP 套接字
int sockfd = socket(AF_INET, SOCK_DGRAM,0); //创建一个 IPV4 的数据包套接字
if(-1 == sockfd)
{
perror("create socket failed");
exit(-1);
}
//可以绑定本地的 socket 的地址
//直接发送消息(定义一个接收消息的地址)
struct sockaddr_in addr; //保存接收消息端地址信息(IP+port)
memset(&addr,0,sizeof(struct sockaddr_in)); //清空结构体
addr.sin_family = AF_INET;
inet_aton(argv[1], &addr.sin_addr);
addr.sin_port = htons(atoi(argv[2]));
char buf[1024] = {0};
while(1)
{
memset(buf,0,1024);
fgets(buf,1024,stdin);
int ret = sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&addr,sizeof(addr)); //发送消息
if(ret <= 0)
{
perror("sendto error");
}
printf("sendto size:%d\n",ret);
}
//关闭套接字
shutdown(sockfd,SHUT_RDWR);
close(sockfd);
return 0;
}
#include
#include
#include /* See NOTES */
#include
#include
#include //为了使用 IPV4 地址结构体
#include
#include
#include
//struct ip_mreq {
// struct in_addr imr_multiaddr; /* IP multicast group address */
// struct in_addr imr_address; /* IP address of local interface */
//};
//./main MultiIP Port
int main(int argc,char *argv[])
{
if(argc != 3)
{
printf("please input ip + port!\n");
return 0;
}
//1.创建一个 UDP 套接字
int sockfd = socket(AF_INET, SOCK_DGRAM,0); //创建一个 IPV4 的数据包套接字
if(-1 == sockfd)
{
perror("create socket failed");
exit(-1);
}
//2.加入指定的多播组
//描述你要加入的多播组
struct ip_mreq mreq;
memset(&mreq,0,sizeof(mreq));
mreq.imr_multiaddr.s_addr = inet_addr(argv[1]); //多播地址
//mreq.imr_interface = inet_addr(argv[2]); //本地网址
mreq.imr_interface.s_addr = htonl(INADDR_ANY); //让内核自动选择一个网卡
int ret = setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(void*)&mreq,sizeof(mreq)); //设置套接字属性
if(ret == -1)
{
perror("setsockopt error");
}
//3.绑定多播地址
//从指定的多播地址接收消息(定义一个接收消息的地址)
struct sockaddr_in addr;
memset(&addr,0,sizeof(struct sockaddr_in)); //清空结构体
addr.sin_family = AF_INET;
inet_aton(argv[1], &addr.sin_addr);
addr.sin_port = htons(atoi(argv[2]));
//绑定一个 IP 地址
ret = bind(sockfd,(struct sockaddr *)&addr,sizeof(addr));
if(ret == -1)
{
perror("bind error");
exit(-1);
}
printf("bind success\n");
char buf[1024] = {0};
struct sockaddr_in send_addr; //用来保存消息发送方的地址
while(1)
{
memset(buf,0,1024);
memset(&send_addr,0,sizeof(struct sockaddr_in)); //清空结构体
socklen_t len = sizeof(send_addr);
ret = recvfrom(sockfd,buf,1024,0,(struct sockaddr*)&send_addr,&len); //接收消息
if(ret <= 0)
{
perror("recv from error");
}
printf("sendIP:%s,sendPort:%d\n",inet_ntoa(send_addr.sin_addr),ntohs(send_addr.sin_port));
printf("recv data:%s\n",buf);
}
//关闭套接字
shutdown(sockfd,SHUT_RDWR);
close(sockfd);
return 0;
}
struct ip_mreq
{
struct in_addr imr_multiaddr; /* IP multicast group address */
//多播组的 IP 地址(你要接收哪一个组上的信息)
struct in_addr imr_address; /* IP address of local interface */
//本地的 IP 地址,多播组的数据包收发通过本地的哪一个网卡
};