求助Linux下的广播通信,谢!

发布于 2022-09-30 19:11:28 字数 6575 浏览 16 评论 0

代码如下,分为服务器和客户端,目的是服务器端用广播的方式向网内的客户端发送服务器时间。程序运行后客户端不能收到服务器端的数据,麻烦大家给看看吧,我实在是搞不懂拿出问题了,谢谢了!

  1. /*服务器端,发送服务器时间给网内客户端*/
  2. #include <sys/socket.h>
  3. #include <sys/ioctl.h>
  4. #include <arpa/inet.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <time.h>
  8. #include <unistd.h>
  9. #define BUFLEN 255
  10. void getcurtime(char * curtime)   //获取服务器端时间
  11. {
  12.         time_t tm;
  13.         time(&tm);
  14.         snprintf(curtime, BUFLEN, "%s\n", ctime(&tm));
  15. }
  16. int main(int argc, char **argv)
  17. {
  18.         struct sockaddr_in peeraddr;
  19.         int sockfd, on = 1;
  20.         int num, i;
  21.         char msg[BUFLEN+1];
  22.         if (argc != 3)         //输入广播地址和端口号
  23.         {
  24.                 printf("Usage:%s<ip address><port>\n", argv[0]);
  25.                 exit(0);
  26.         }
  27.         sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  28.         if (sockfd < 0)
  29.         {
  30.                 printf(stderr, "socket creating error in broadcatServ.\n");
  31.                 exit(1);
  32.         }
  33.         setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(int)); //设置广播标识
  34.         memset(&peeraddr, 0, sizeof(struct sockaddr_in));
  35.         peeraddr.sin_family = AF_INET;
  36.         if (inet_pton(AF_INET, argv[1], &peeraddr.sin_addr) <= 0)
  37.         {
  38.                 printf("wrong ip address\n");
  39.                 exit(0);
  40.         }
  41.         peeraddr.sin_port = htons(atoi(argv[2]));
  42.         while (1)
  43.         {
  44.                 getcurtime(msg);
  45.                 int a;
  46.                 a = sendto(sockfd, msg, 0, (struct sockaddr *)&peeraddr, sizeof(struct sockaddr_in));    //向广播地址发送信息
  47.                 printf("%d", a);
  48.                 fflush(stdout);
  49.                 Sleep(5);
  50.         }
  51. }

复制代码

  1. /*客户端,用于接收服务器的广播信息(服务器时间)*/
  2. /*头未经年检可能会有不足,补一下就ok了,但不是我所遇到问题的原因*/
  3. #include <sys/socket.h>
  4. #include <sys/types.h>
  5. #include <arpa/inet.h>
  6. #include <stdio.h>
  7. #include <time.h>
  8. #include <string.h>
  9. #define BUFLEN 255
  10. int main(int argc, char **argv)
  11. {
  12.         struct sockaddr_in localaddr;
  13.         int sockfd, n;
  14.         char msg[BUFLEN+1];
  15.         if (argc != 2)                              //输入待接收数据的端口号
  16.         {
  17.                 printf("Usage:%s<port>\n",argv[0]);
  18.                 exit(0);
  19.         }
  20.        
  21.         sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  22.         if (sockfd < 0)
  23.         {
  24.                 fprintf(stderr, "socket creating error\n");
  25.                 exit(1);
  26.         }
  27.         memset(&localaddr, 0, sizeof(struct sockaddr_in));
  28.         localaddr.sin_port = htons(atoi(argv[1]));
  29.         localaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  30.         int opt = SO_REUSEADDR;                                        //以防出现bind错误
  31.         setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int));
  32.         if (bind(sockfd, (struct sockaddr *)&localaddr, sizeof(struct sockaddr_in)) < 0)
  33.         {
  34.                 fprintf(stderr, "bind error\n");
  35.                 exit(2);
  36.         }
  37.         n = read(sockfd, msg, BUFLEN);    //接收服务器端发送过来的数据(测试的时候就是这里收不到数据)
  38.         if (n == -1)
  39.         {
  40.                 fprintf(stderr, "read error\n");
  41.                 exit(3);
  42.         }
  43.         else
  44.         {
  45.                 msg[n] = '\0';
  46.                 printf("%s",msg);
  47.         }
  48. }

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文