sock使用UDP协议进行广播发送数据
生活随笔
收集整理的這篇文章主要介紹了
sock使用UDP协议进行广播发送数据
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用ifconfig命令查看自己的廣播地址:
wlp3s0b1 Link encap:以太網 硬件地址 inet 地址:192.168.1.102 廣播:192.168.1.255 掩碼:255.255.255.0可以看到主機的廣播地址是192.168.1.255
編寫UDP服務器程序:
#include <sys/socket.h> #include <netdb.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <signal.h> #include <time.h> #include <arpa/inet.h>int sockfd;void sig_handler(int signo);int main(int argc, char * argv[]) {if(argc < 2){printf("usage: %s port\n", argv[0]);exit(1);}if(signal(SIGINT, sig_handler) == SIG_ERR) //開始捕獲信號 SIGINT {perror("signal sigint error!");exit(1);}/*步驟1: 創建socket*/sockfd = socket(AF_INET, SOCK_DGRAM, 0);if(sockfd < 0){perror("socket error!");exit(1);}/*步驟2: 調用bind函數對socket和地址進行綁定*/struct sockaddr_in serveraddr;memset(&serveraddr, 0, sizeof(serveraddr));serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(atoi(argv[1])); //portserveraddr.sin_addr.s_addr = INADDR_ANY; //ip匹配所有的ipif(bind(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0){perror("bind error!");exit(1);}struct sockaddr_in clientaddr;socklen_t len = sizeof(clientaddr);char buffer[1024];while(1){memset(buffer, 0, sizeof(buffer));memset(&clientaddr, 0, sizeof(clientaddr));if(recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*)&clientaddr, &len) < 0){perror("recvfrom error!");exit(1);}else{char ip[16];inet_ntop(AF_INET, &clientaddr.sin_addr.s_addr, ip, sizeof(ip));int port = ntohs(clientaddr.sin_port);printf("%s(%d): %s\n", ip, port, buffer);}} }void sig_handler(int signo) {if(signo == SIGINT){printf("receiver clolse!\n");;close(sockfd);exit(1);} }編寫UDP廣播程序:
#include <sys/socket.h> #include <netdb.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <signal.h> #include <time.h> #include <arpa/inet.h>int sockfd;void sig_handler(int signo);int main(int argc, char * argv[]) {if(argc < 3){printf("usage: %s port\n", argv[0]);exit(1);}if(signal(SIGINT, sig_handler) == SIG_ERR) //開始捕獲信號 SIGINT {perror("signal sigint error!");exit(1);}/*步驟1: 創建socket*/sockfd = socket(AF_INET, SOCK_DGRAM, 0);if(sockfd < 0){perror("socket error!");exit(1);}int opt = 1;setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt));/*步驟2: 調用bind函數對socket和地址進行綁定*/struct sockaddr_in serveraddr;memset(&serveraddr, 0, sizeof(serveraddr));serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(atoi(argv[2])); //portinet_ntop(AF_INET, (struct sockaddr*)&serveraddr.sin_addr.s_addr,argv[1], sizeof(argv[1]));printf("I will broadcast...\n");char *info = "hello Andrew";size_t size = strlen(info) * sizeof(char);if(sendto(sockfd, info, size, 0, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0){perror("sendto error!");exit(1);}else{printf("broadcastn success!\n");}}void sig_handler(int signo) {if(signo == SIGINT){printf("receiver clolse!\n");;close(sockfd);exit(1);} }測試:
運行服務器:
andrew@andrew-Thurley:~/work/network$ bin/receiver 8888 127.0.0.1(35423): hello Andrew 127.0.0.1(43304): hello Andrew 127.0.0.1(58134): hello Andrew 127.0.0.1(53262): hello Andrew 127.0.0.1(35285): hello Andrew 127.0.0.1(58630): hello Andrew 127.0.0.1(41278): hello Andrew 127.0.0.1(39032): hello Andrew 127.0.0.1(55642): hello Andrew 127.0.0.1(44132): hello Andrew 127.0.0.1(35112): hello Andrew運行客戶端:
andrew@andrew-Thurley:~/work/network$ bin/broadcast 192.168.1.255 usage: bin/broadcast port andrew@andrew-Thurley:~/work/network$ bin/broadcast 192.168.1.255 8888 I will broadcast... broadcastn success! andrew@andrew-Thurley:~/work/network$ bin/broadcast 192.168.1.255 8888 I will broadcast... broadcastn success! andrew@andrew-Thurley:~/work/network$ bin/broadcast 192.168.1.255 8888?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的sock使用UDP协议进行广播发送数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于UDP客户端服务器的编程模型-lin
- 下一篇: 祝贺本刊编委石勇教授入选2016年汤森路