流程:
创建套接字
填充接收端(服务器)网络信息结构体
bind(非必须绑定)
设置允许广播
向接收端(服务器)发送数据
关闭套接字文件
#include
#include
#include
#include
#include
#include
#include #define ERR_MSG(msg) do{\fprintf(stderr,"LINE:__%d__",__LINE__);\perror(msg);\
}while(0)#define PORT 3333
#define IP "172.17,94.255"int main(int argc, const char *argv[])
{int fd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == fd){ERR_MSG("socket");return -1;}//填充接受端的网络信息结构体struct sockaddr_in recvaddr;recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(PORT);recvaddr.sin_addr.s_addr = inet_addr(IP);//bind可绑可不绑//设置允许广播int broad = 1;if(-1 == setsockopt(fd,SOL_SOCKET,SO_BROADCAST,\&broad,sizeof(broad))){ERR_MSG("setsockopt");return -1;}printf("broad set success broad = %d\n",broad);char buf[128] = "";ssize_t res = 0;while(1){//向服务器发送数据bzero(buf,sizeof(buf));fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1] = 0;if(-1 == sendto(fd,buf,sizeof(buf),0,\(struct sockaddr*)&recvaddr,sizeof(recvaddr))){ERR_MSG("sendto");return -1;}printf("sendto success\n");}//关闭套接字close(fd);return 0;
}
流程:
创建套接字
填充接收端(本身)(服务器)的网络信息结构体
bind(必须) 绑定套接字和自身的网络信息结构体
新建一个网络信息结构体,用来存储发送端的地址信息
接受发送端发来的数据
关闭套接字
#include
#include
#include
#include
#include
#include
#include #define ERR_MSG(msg) do{\fprintf(stderr,"LINE:__%d__",__LINE__);\perror(msg);\
}while(0)#define PORT 3333
#define IP "172.17,94.255"int main(int argc, const char *argv[])
{int fd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == fd){ERR_MSG("socket");return -1;}//填充接受端的网络信息结构体struct sockaddr_in recvaddr;int len = sizeof(recvaddr);recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(PORT);recvaddr.sin_addr.s_addr = inet_addr(IP);//必须绑定if(-1 == bind(fd,(struct sockaddr*)&recvaddr,len)){ERR_MSG("bind");return -1;}printf("bind success\n");//新建一个网络信息结构体,用来存储接受的数据从哪来struct sockaddr_in sendaddr;int sendlen = sizeof(sendaddr);char buf[128] = "";ssize_t res = 0;while(1){//接受发送端(客户端)发来的数据bzero(buf,sizeof(buf));if(-1 == recvfrom(fd,buf,sizeof(buf),0,\(struct sockaddr*)&sendaddr,&sendlen)){ERR_MSG("recvfrom");return -1;}printf("recvfrom success\n");printf("[%s:%d] msg:%s\n",inet_ntoa(sendaddr.sin_addr),\ntohs(sendaddr.sin_port),buf);}//关闭套接字close(fd);return 0;
}
流程:
创建套接字
填充接收端(服务器)的网络信息结构体 (IP为广播组的IP地址)
bind(非必须)
设置允许广播
发送广播信息
关闭套接字
#include
#include
#include
#include
#include
#include
#include #define ERR_MSG(msg) do{\fprintf(stderr,"LINE:__%d__",__LINE__);\perror(msg);\
}while(0)#define PORT 3333
#define IP "224.1.2.3"int main(int argc, const char *argv[])
{int fd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == fd){ERR_MSG("socket");return -1;}//填充接受端的网络信息结构体struct sockaddr_in recvaddr;recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(PORT);recvaddr.sin_addr.s_addr = inet_addr(IP);//bind可绑可不绑//设置允许广播int broad = 1;if(-1 == setsockopt(fd,SOL_SOCKET,SO_BROADCAST,\&broad,sizeof(broad))){ERR_MSG("setsockopt");return -1;}printf("broad set success broad = %d\n",broad);char buf[128] = "";ssize_t res = 0;while(1){//向服务器发送数据bzero(buf,sizeof(buf));fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1] = 0;if(-1 == sendto(fd,buf,sizeof(buf),0,\(struct sockaddr*)&recvaddr,sizeof(recvaddr))){ERR_MSG("sendto");return -1;}printf("sendto success\n");}//关闭套接字close(fd);return 0;
}
流程:
创建套接字
填充接收端(自身、服务器)的网络信息结构体(广播组IP…)
bind(必须绑定)绑定服务器与套接字
填充广播组的网络信息结构体(广播组IP,本地IP,网卡编号)
滴滴:查询网卡编号:ifconfig 查看使用的是哪个网卡,再 ip ad 查看对应的编号
添加广播组
新建一个网络信息结构体用来存储发送端的地址信息
循环接受信息
关闭套接字
#include
#include
#include
#include
#include
#include
#include #define ERR_MSG(msg) do{\fprintf(stderr,"LINE:__%d__",__LINE__);\perror(msg);\
}while(0)#define PORT 3333
#define IP "224.1.2.3"int main(int argc, const char *argv[])
{int fd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == fd){ERR_MSG("socket");return -1;}//填充接受端的网络信息结构体struct sockaddr_in recvaddr;int len = sizeof(recvaddr);recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(PORT);recvaddr.sin_addr.s_addr = inet_addr(IP);//必须绑定if(-1 == bind(fd,(struct sockaddr*)&recvaddr,len)){ERR_MSG("bind");return -1;}printf("bind success\n");//加入多播组struct ip_mreqn mq;mq.imr_multiaddr.s_addr = inet_addr(IP);//多播组的组ipmq.imr_address.s_addr = inet_addr("172.17.94.145");//本地IPmq.imr_ifindex = 3;//网络设备编号,指定网卡号if(-1 == setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,\&mq,sizeof(mq))){ERR_MSG("setsockopt");return -1;}printf("membership set succes ");//新建一个网络信息结构体,用来存储接受的数据从哪来struct sockaddr_in sendaddr;int sendlen = sizeof(sendaddr);char buf[128] = "";ssize_t res = 0;while(1){//接受发送端(客户端)发来的数据bzero(buf,sizeof(buf));res = recvfrom(fd,buf,sizeof(buf),0,\(struct sockaddr*)&sendaddr,&sendlen);if(-1 == res){ERR_MSG("recvfrom");return -1;}else if(0 == res){printf("发送端退出\n");break;}printf("recvfrom success\n");printf("[%s:%d] msg:%s\n",inet_ntoa(sendaddr.sin_addr),\ntohs(sendaddr.sin_port),buf);}//关闭套接字close(fd);return 0;
}
结果: