鱼C论坛

 找回密码
 立即注册
查看: 1685|回复: 6

[技术交流] UDP 广播

[复制链接]
发表于 2015-12-12 16:19:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

在bind 广播地址 会一直返回-1,忽略即可~

广播你懂的,局域网virus,通信必备。

服务器代码:
  1. #include <stdio.h>
  2. #include <windows.h>
  3. #pragma comment(lib,"ws2_32.lib")
  4. #define ServicPort 1447
  5. void showerr(char * err,bool exit1)
  6. {
  7.         printf(err);
  8.         if(exit1)
  9.         {
  10.                 getchar();
  11.                 exit(0);
  12.         }
  13. }
  14. int main()
  15. {
  16.         WSAData wdata;
  17.         WSAStartup(MAKEWORD(2,2),&wdata);
  18.         SOCKET service;
  19.         SOCKADDR_IN saddr={0};
  20.         service = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
  21.         int iaddrlen;
  22.         if(service == INVALID_SOCKET)
  23.         {
  24.                 showerr("不能创建套接字!\n",true);
  25.                 return 0;
  26.         }
  27.         saddr.sin_port = htons(ServicPort);
  28.         saddr.sin_family = AF_INET;
  29.         saddr.sin_addr.S_un.S_addr = INADDR_BROADCAST;
  30.         iaddrlen = sizeof(SOCKADDR_IN);
  31.         //设置该套接字为广播类型
  32.         bool bOpt = true;
  33.         setsockopt(service,SOL_SOCKET,SO_BROADCAST,(char *)&bOpt,sizeof(bOpt));
  34.         int err = bind(service,(SOCKADDR * )&saddr,iaddrlen);
  35.         while(true)
  36.         {
  37.                 char * buffer = "Hello world!\n There is socket broadcast test !\n";

  38.                 int iret =
  39.                         sendto(service,buffer,strlen(buffer),0,(SOCKADDR * )&saddr,iaddrlen);

  40.                 if(iret ==  SOCKET_ERROR)
  41.                         printf("Send failed!\n");
  42.                 else
  43.                         printf("Success \n");

  44.                 Sleep(500);
  45.         }
  46.         return 0;
  47. }
复制代码


接收器代码:
  1. #include <stdio.h>
  2. #include <windows.h>
  3. #pragma comment(lib,"ws2_32.lib")
  4. #define ServicPort 1447
  5. void showerr(char * err,bool exit1)
  6. {
  7.         printf(err);
  8.         if(exit1)
  9.         {
  10.                 getchar();
  11.                 exit(0);
  12.         }
  13. }

  14. int main()
  15. {
  16.         WSAData wdata;
  17.         WSAStartup(MAKEWORD(2,2),&wdata);
  18.         SOCKET connect_sock;
  19.         SOCKADDR_IN saddr={0};
  20.         SOCKADDR_IN saddr_from={0};
  21.         connect_sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
  22.         int iaddrlen;
  23.         if(connect_sock == INVALID_SOCKET)
  24.         {
  25.                 showerr("不能创建套接字!\n",true);
  26.                 return 0;
  27.         }
  28.         saddr.sin_port = htons(ServicPort);
  29.         saddr.sin_family = AF_INET;
  30.         saddr.sin_addr.S_un.S_addr = 0;

  31.         saddr_from.sin_port = htons(ServicPort);
  32.         saddr_from.sin_family = AF_INET;
  33.         saddr_from.sin_addr.S_un.S_addr = INADDR_BROADCAST;

  34.         iaddrlen = sizeof(SOCKADDR_IN);
  35.         //设置该套接字为广播类型
  36.         bool bOpt = true;
  37.         setsockopt(connect_sock,SOL_SOCKET,SO_BROADCAST,(char *)&bOpt,sizeof(bOpt));
  38.         int err = bind(connect_sock,(SOCKADDR * )&saddr,iaddrlen);
  39.         if(err != 0)
  40.         {
  41.                 printf("%d %d\n",err,WSAGetLastError());
  42.                 showerr("绑定套接字失败!\n",true);
  43.         }
  44.         int count = 0;
  45.         while(true)
  46.         {
  47.                 char buffer[1024]={0};

  48.                 int nsize;
  49.                 nsize = recvfrom(connect_sock,buffer,1024,0,(SOCKADDR *)&saddr_from,&iaddrlen);
  50.                 if(nsize>0)
  51.                         printf("%d : %s \n\n",count++,buffer);
  52.                 Sleep(2000);
  53.         }
  54.         return 0;
  55. }
复制代码

评分

参与人数 1荣誉 +10 鱼币 +10 贡献 +10 收起 理由
康小泡 + 10 + 10 + 10 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-12-12 16:34:35 | 显示全部楼层
挺好~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-12-12 16:35:52 | 显示全部楼层

因为bind一直返回-1,我以为哪里错了,调试了半个小时。。
Google后才知道,原来bind广播地址无论如何都返回-1.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-12 17:24:50 | 显示全部楼层
开始搞网络通信了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-12 19:58:03 | 显示全部楼层

甲鱼哥,求你跟我说句话:hug:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-12 19:58:57 | 显示全部楼层
可是路由从不转发广播。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-12 20:31:38 | 显示全部楼层
Run_Feng 发表于 2015-12-12 19:58
可是路由从不转发广播。。

吓得我感觉去测试了一下,
可以的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 13:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表