求助Linux下的广播通信,谢!
代码如下,分为服务器和客户端,目的是服务器端用广播的方式向网内的客户端发送服务器时间。程序运行后客户端不能收到服务器端的数据,麻烦大家给看看吧,我实在是搞不懂拿出问题了,谢谢了!
- /*服务器端,发送服务器时间给网内客户端*/
- #include <sys/socket.h>
- #include <sys/ioctl.h>
- #include <arpa/inet.h>
- #include <stdio.h>
- #include <string.h>
- #include <time.h>
- #include <unistd.h>
- #define BUFLEN 255
- void getcurtime(char * curtime) //获取服务器端时间
- {
- time_t tm;
- time(&tm);
- snprintf(curtime, BUFLEN, "%s\n", ctime(&tm));
- }
- int main(int argc, char **argv)
- {
- struct sockaddr_in peeraddr;
- int sockfd, on = 1;
- int num, i;
- char msg[BUFLEN+1];
- if (argc != 3) //输入广播地址和端口号
- {
- printf("Usage:%s<ip address><port>\n", argv[0]);
- exit(0);
- }
- sockfd = socket(AF_INET, SOCK_DGRAM, 0);
- if (sockfd < 0)
- {
- printf(stderr, "socket creating error in broadcatServ.\n");
- exit(1);
- }
- setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(int)); //设置广播标识
- memset(&peeraddr, 0, sizeof(struct sockaddr_in));
- peeraddr.sin_family = AF_INET;
- if (inet_pton(AF_INET, argv[1], &peeraddr.sin_addr) <= 0)
- {
- printf("wrong ip address\n");
- exit(0);
- }
- peeraddr.sin_port = htons(atoi(argv[2]));
- while (1)
- {
- getcurtime(msg);
- int a;
- a = sendto(sockfd, msg, 0, (struct sockaddr *)&peeraddr, sizeof(struct sockaddr_in)); //向广播地址发送信息
- printf("%d", a);
- fflush(stdout);
- Sleep(5);
- }
- }
复制代码
- /*客户端,用于接收服务器的广播信息(服务器时间)*/
- /*头未经年检可能会有不足,补一下就ok了,但不是我所遇到问题的原因*/
- #include <sys/socket.h>
- #include <sys/types.h>
- #include <arpa/inet.h>
- #include <stdio.h>
- #include <time.h>
- #include <string.h>
- #define BUFLEN 255
- int main(int argc, char **argv)
- {
- struct sockaddr_in localaddr;
- int sockfd, n;
- char msg[BUFLEN+1];
- if (argc != 2) //输入待接收数据的端口号
- {
- printf("Usage:%s<port>\n",argv[0]);
- exit(0);
- }
- sockfd = socket(AF_INET, SOCK_DGRAM, 0);
- if (sockfd < 0)
- {
- fprintf(stderr, "socket creating error\n");
- exit(1);
- }
- memset(&localaddr, 0, sizeof(struct sockaddr_in));
- localaddr.sin_port = htons(atoi(argv[1]));
- localaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- int opt = SO_REUSEADDR; //以防出现bind错误
- setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int));
- if (bind(sockfd, (struct sockaddr *)&localaddr, sizeof(struct sockaddr_in)) < 0)
- {
- fprintf(stderr, "bind error\n");
- exit(2);
- }
- n = read(sockfd, msg, BUFLEN); //接收服务器端发送过来的数据(测试的时候就是这里收不到数据)
- if (n == -1)
- {
- fprintf(stderr, "read error\n");
- exit(3);
- }
- else
- {
- msg[n] = '\0';
- printf("%s",msg);
- }
- }
复制代码
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论