Linux里UDP协议 广播和接收测试 C语言

UDP协议是面向无连接的,和TCP比起来少了繁琐的三次握手,但是在安全性上没有保障,不过对于聊天来说一般都是用的这个,下面是一个测试UDP协议的简单实验:


server

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>    //socket() 
#include <netinet/in.h>   // inet_addr()
#include <arpa/inet.h>
#include <unistd.h>        // read()/ write

#include <errno.h>
extern int errno;
int main(int argc, char *argv[])
{

   int fd = socket(AF_INET, SOCK_DGRAM, 0);
   fprintf(stderr, "socket id = %d\n", fd);

   // 地址复用
   int on = 1;
   setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));


   struct sockaddr_in servaddr;
   servaddr.sin_family = AF_INET;
   if(argc == 2)
      servaddr.sin_port =  htons(atoi(argv[1]));
   else
      servaddr.sin_port   = htons(8877);
   servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // 0.0.0.0
   //servaddr.sin_addr.s_addr = htonl(127.0.0.1); // 0.0.0.0
   int ret = bind(fd, (struct sockaddr *)&servaddr, sizeof(servaddr));
   if(ret < 0)
   {
      fprintf(stderr, "error:%s\n", strerror(errno));
      close(fd);
      return -1;
   }

   struct sockaddr_in peer;  // 保存对方的地址信息
   socklen_t size;
   char buff[1024];
   int cnt;
   char ip[16];
   while(1)
   {
      bzero(&peer, sizeof(peer));
      size = sizeof(peer);
      //recv
      cnt = recvfrom(fd, buff, 1024, 0, (struct sockaddr *)&peer, &size);
      printf("ip:%s, port:%d\n", inet_ntoa(peer.sin_addr), ntohs(peer.sin_port));
      inet_ntop(AF_INET, &(peer.sin_addr), ip, 16);
      printf("ip:%s, port:%d\n", ip, ntohs(peer.sin_port));
      printf("recv: %s\n", buff);
      if(cnt <= 0)
         fprintf(stderr, "recv error or end\n");
      else
         sendto(fd, buff, cnt, 0, (struct sockaddr *)&peer, sizeof(peer));
   }

   close(fd);




   return 0;
}

broad

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>

#include<errno.h>

int main(int argc,char *argv[])
{
   int fd = socket(AF_INET,SOCK_DGRAM,0);
 
   int on = 1;
   setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));

   int br =1;
   setsockopt(fd,SOL_SOCKET,SO_BROADCAST,&br,sizeof(br));

   struct sockaddr_in broadcast;
   broadcast.sin_family = AF_INET;
   broadcast.sin_port = htons(8877);
   broadcast.sin_addr.s_addr = inet_addr("255.255.255.255");

   char *pts = "Dge";
   while(1)
   {
      sendto(fd,pts,strlen(pts)+1,0,(struct sockaddr *)&broadcast,sizeof(broadcast));
      sleep(1);
   }
   
   close(fd);
   return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值