UDP 服务器与多个客户端通信

服务端与多个客户端进行连接,接收客户端发送来的信息。通信端口5000

服务端:IP设置为196.168.1.100

   int sock_fd = socket(PF_INET, SOCK_DGRAM, 0);

     if (sock_fd < 0)
     {
         printf ( "error: Create Socket Failed!" );
         return  -1;
     }
     
     struct  sockaddr_in sock_addr;
     sock_addr.sin_family = AF_INET;
     sock_addr.sin_port = htons(5000);
     sock_addr.sin_addr.s_addr = htonl(INADDR_ANY);
     memset (sock_addr.sin_zero, 0x00, 8);
     
     try
     {
         if (bind(sock_fd, ( struct  sockaddr *)&sock_addr, sizeof ( struct  sockaddr)) != 0)   //绑定
         {
             printf ( "error: Bind Socket Failed!" );
             res = -1;
             throw  res;
         }
         
    int iModel = 1;
    ioctlsocket(sock_fd, FIONBIO, &iModel);     //设置为非阻塞模式,就是接收的时候如果缓冲区没有数据就直接返回,不会等待。
 
         char  buf[256];
         int  recvslen;
         struct  sockaddr_in from;
         uint32_t fromlen = sizeof(struct sockaddr);
         while (1)
         {
             if ((recvslen = recvfrom(sock_fd, recvs, 256, 0, ( struct  sockaddr *)&from , &fromlen)) == -1)
             {
                 printf ( "error: Receiving Failed!" );
                 res = -1;
                 throw  res;
             }
             else
             {
                 if (recvslen < 256)
                     *(recvs+recvslen) = '\0' ;
                 else
                     *(recvs+255) = '\0' ;
        if (from.sin_addr.s_addr == inet_addr(196.168.1.2)){      //根据from的IP地址来确定是接收的哪个IP发来的信息
                   printf ( "Received data:\n[%s] from 196.168.1.2\n" ,recvs);
        }
             }
         }
     }
     catch (...)
     {
         printf ( "error catched~" );
     }
 
客户端:以IP 196.168.1.2为例

 int sock_fd = socket(PF_INET, SOCK_DGRAM, 0);

     if (sock_fd < 0)
     {
         printf ( "error: Create Socket Failed!" );
         return  -1;
     }
     
     struct  sockaddr_in addrTo;
    addrTo .sin_family = AF_INET;
    addrTo .sin_port = htons(5000);
    addrTo .sin_addr.s_addr = htonl("196.168.1.100");  //服务端的地址
     memset (addrTo.sin_zero, 0x00, 8);
     
     try
     {
         char  buf[256] = "This is from 196.168.1.2";
         int n ;
         struct  sockaddr_in to;
         uint32_t tolen = sizeof(struct sockaddr);
         while (1)
         {
             if ((n= sendto(sock_fd, recvs, 5000, 0, ( struct  sockaddr *)&addrTo, &tolen)) == -1)
             {
                 printf ( "error: Receiving Failed!" );
                 res = -1;
                 throw  res;
             }
             else if (n > 0)
             {  
        printf ( "Send data to 196.168.1.100\n" );
             }
         }
     }
     catch (...)
     {
         printf ( "error catched~" );
     }

转载于:https://www.cnblogs.com/blue-sky-hahaha/p/4676714.html

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值