socket广播编程

server.c服务器部分

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc,char **argv)
{
 if(argc!=2)
 {
  printf("usage: ./server <port>");
  exit(0);
 }
 int sockfd;
 //1.create a socket
 if((sockfd = socket(PF_INET,SOCK_DGRAM,0))<0)
 {
  fprintf(stderr,"socket faield:%s\n",strerror(errno));
  exit(-1);
 }
 
 //2.bind a addr struct
 struct sockaddr_in local_ipv4_addr;
 memset(&local_ipv4_addr,0,sizeof(local_ipv4_addr));
 local_ipv4_addr.sin_family = AF_INET;
 local_ipv4_addr.sin_port = htons(strtol(argv[1],NULL,10));
 //绑定本机所有网络接口
 //local_ipv4_addr.sin_addr.s_addr = INADDR_ANY;
 inet_pton(AF_INET,"127.0.0.1",&local_ipv4_addr.sin_addr);
 
 if(bind(sockfd,(struct sockaddr*)&local_ipv4_addr,sizeof(local_ipv4_addr))<0)
 {
  fprintf(stderr,"bind failed:%s\n",strerror(errno));
  exit(-1);
 }

 //3.sento/recvfrom
 struct sockaddr_in peer_ipv4_addr;
 char buf[255];
 int ret_r;
 socklen_t len = sizeof(peer_ipv4_addr);
 if((ret_r=recvfrom(sockfd,buf,sizeof(buf)-1,0,(struct sockaddr*)&peer_ipv4_addr,&len))<0)
 {
  fprintf(stderr,"recv failed:%s\n",strerror(errno));
  exit(-1);
 }
 buf[ret_r] = 0;
 printf("broadcast msg: %s\n",buf);
 
 //4.close
 close(sockfd);

 return 0;
}

client.c客户机部分

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc,char **argv)
{
 if(argc!=3)
 {
  printf("usage: ./client <port> <msg>");
  exit(0);
 }
 int sockfd;
 //1.create a socket
 if((sockfd = socket(PF_INET,SOCK_DGRAM,0))<0)
 {
  fprintf(stderr,"socket faield:%s\n",strerror(errno));
  exit(-1);
 }

 //1.1 set broadcast option
 int optval = 1;
 if(setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&optval,sizeof(optval))<0)
 {
  fprintf(stderr,"set broadcast option failed:%s\n",strerror(errno));
  exit(-1);
 }
 
 //2.sento/recvfrom
 struct sockaddr_in broadcast_addr;
 memset(&broadcast_addr,0,sizeof(broadcast_addr));
 broadcast_addr.sin_family = AF_INET;
 broadcast_addr.sin_port = htons(strtol(argv[1],NULL,10));
 broadcast_addr.sin_addr.s_addr = INADDR_BROADCAST;

 int ret_w;
 //writefully
 if((ret_w=sendto(sockfd,argv[2],strlen(argv[2]),0,(struct sockaddr*)&broadcast_addr,sizeof(broadcast_addr)))<0)
 {
  fprintf(stderr,"send failed:%s\n",strerror(errno));
  exit(-1);
 }
 printf("send msg success!\n");
 
 //3.close
 close(sockfd);

 return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值