广播发送
**************************************************************************************************************
#include <stdio.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <string.h>
#include <unistd.h>
//广播的端口号和主机IP
#define SIN_PORT 8888
#define SIN_IP "192.168.31.255"
//客户端的端口号和主机IP
#define CIN_PORT 6666
#define CIN_IP "192.168.31.162"
#define ERR_MSG(msg) do{\
fprintf(stderr,"__%d__\n",__LINE__);\
perror(msg);\
}while(0)
int main(int argc, const char *argv[])
{
//1、创建套接字(服务器端)
int sfd = socket(AF_INET,SOCK_DGRAM,0);
if(sfd<0)
{
ERR_MSG("socket");
return -1;
}
//设置为允许广播
int data =100;
if(setsockopt(sfd,SOL_SOCKET,SO_BROADCAST,&data,sizeof(data))<0)
{
ERR_MSG("setsockopt");
return -1;
}
//服务器地址信息结构体
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(SIN_PORT);//端口号(主机端口号转为网络字节序)
sin.sin_addr.s_addr =inet_addr(SIN_IP);//服务器IP的网络字节序
//客户端地址信息结构体
struct sockaddr_in cin;
/*
cin.sin_family = AF_INET;
cin.sin_port = htons(CIN_PORT);//端口号(客户端主机端口号转为网络字节序)
cin.sin_addr.s_addr =inet_addr(CIN_IP);//客户端IP的网络字节序
//2、绑定客户端IP地址和端口号
if(bind(sfd,(struct sockaddr *)&cin,sizeof(cin))<0)
{
ERR_MSG("bind");
return -1;
}
printf("Udp客户端绑定成功\n");
*/
//变量初始化
char buf[32]="";
socklen_t sinlen=sizeof(sin);
socklen_t cinlen=sizeof(cin);
ssize_t sd=0,rcv=0;
while(1)
{
//4、发送数据,要指定发送到的地址
bzero(buf,sizeof(buf));
printf("要发送到服务器的数据-->");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1] = 0;
sd = sendto(sfd,&buf,sizeof(buf),0,(struct sockaddr*)&sin,sinlen);
if(sd<0)
{
ERR_MSG("sendto");
return -1;
}
printf("发送成功\n");
}
//5、关闭套接字
close(sfd);
return 0;
}
**************************************************************************************************************
广播接收
**************************************************************************************************************
#include <stdio.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <string.h>
#include <unistd.h>
#define PORT 8888
#define IP "192.168.31.255"
#define ERR_MSG(msg) do{\
fprintf(stderr,"__%d__\n",__LINE__);\
perror("msg");\
}while(0)
int main(int argc, const char *argv[])
{
//1、创建广播报式套接字
int sfd = socket(AF_INET,SOCK_DGRAM,0);
if(sfd<0)
{
ERR_MSG("socket");
return -1;
}
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);//广播端口号(主机端口号转为网络字节序)
sin.sin_addr.s_addr =inet_addr(IP);//广播IP的网络字节序
//2、绑定广播IP地址、端口号和套接字的文件描述符上
if(bind(sfd,(struct sockaddr *)&sin,sizeof(sin))<0)
{
ERR_MSG("bind");
return -1;
}
printf("Udp服务器绑定成功\n");
//变量初始化
char buf[32]="";
struct sockaddr_in cin;
socklen_t cinlen=sizeof(cin);
while(1)
{
//3、接收数据
ssize_t rcv=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&cinlen);
if(rcv<0)
{
ERR_MSG("recvfrom");
return -1;
}
printf("__%d__,%s:%d:%s\n",\
__LINE__,inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);
}
//5、关闭套接字
close(sfd);
return 0;
}