广播数据扫描和发送
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <netinet/ip.h>#include <arpa/inet.h>#include <sys/stat.h>#include <fcntl.h>#include <errno.h>#include <netinet/in.h>#include <sys/types.h>#include <sys/socket.h>#include <unistd.h>#include <pthread.h>#include <sys/select.h> #define ERRLOG(errmsg) do{\ perror(errmsg);\ printf("%s--%s(%d)\n", __FILE__, __func__, __LINE__);\ exit(-1);\ }while(0) int scanMsg(const char* ip, const char* port, const char* groupNamePack, const char* masterIP){ int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if(-1 == sockfd){ ERRLOG("socket error"); close(sockfd); return -1; } struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(atoi(port)); server_addr.sin_addr.s_addr = inet_addr(ip); socklen_t addrlen = sizeof(server_addr); if(-1 == bind(sockfd, (struct sockaddr *)&server_addr, addrlen)){ ERRLOG("bind error"); close(sockfd); return -1; } struct sockaddr_in client_addr; memset(&server_addr, 0, sizeof(client_addr)); socklen_t clientaddrlen = sizeof(client_addr); char buff[128] = {0}; fd_set rset; FD_ZERO(&rset); FD_SET(sockfd, &rset); struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 100*1000; int retsta = select(sockfd + 1, &rset, NULL, NULL, &tv); if(retsta < 0){ ERRLOG("select error"); close(sockfd); return -1; }else if (retsta > 0 && FD_ISSET(sockfd, &rset)){ if(-1 == recvfrom(sockfd, buff, 128, 0, (struct sockaddr *)&client_addr, &clientaddrlen)){ ERRLOG("recvfrom error"); close(sockfd); return -1; } printf("%s(%d):%s\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), buff); if(strcmp(buff, groupNamePack) == 0){ //发送应答信息 if(-1 == sendto(sockfd, masterIP, strlen(masterIP), 0, (struct sockaddr *)&client_addr, clientaddrlen)){ ERRLOG("sendto error"); close(sockfd); return -1; } } }else{ printf("scanMsg don't receive mess\n"); } close(sockfd); return 0;} int sendMsg(const char* ip, const char* port, const char* groupNamePack, char* masterIP, size_t len){ int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if(-1 == sockfd){ ERRLOG("socket error"); close(sockfd); return -1; } //设置套接字允许发送广播 int on = 1; if(-1 == setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on))){ ERRLOG("setsockopt error"); close(sockfd); return -1; } struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(atoi(port)); server_addr.sin_addr.s_addr = inet_addr(ip); socklen_t addrlen = sizeof(server_addr); if(-1 == sendto(sockfd, groupNamePack, strlen(groupNamePack), 0, (struct sockaddr *)&server_addr, addrlen)){ ERRLOG("sendto error"); close(sockfd); return -1; } struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 1000*100; fd_set rset; FD_ZERO(&rset); FD_SET(sockfd, &rset); int retsta = select(sockfd + 1, &rset, NULL, NULL, &tv); if(retsta < 0){ ERRLOG("select error"); close(sockfd); return -1; }else if (retsta > 0 && FD_ISSET(sockfd, &rset)){ if(-1 == recvfrom(sockfd, masterIP, len, 0, NULL, NULL)){ ERRLOG("recvfrom error"); close(sockfd); return -1; } }else{ printf("sendMsg don't receive\n"); } close(sockfd); return 0;}void* run(void* arg){ while(true){ scanMsg("192.168.1.255", "4000", "sjhdhasdhjshj", "this is my ip"); usleep(1000); } return NULL;}int main(int argc, char const *argv[]){ pthread_t tid; pthread_create(&tid, NULL, run, NULL); // pthread_join(tid, NULL); char msIP[128] = {0}; sendMsg("192.168.1.255", "4000", "sjhdhasdhjshj", msIP, 128); if(strlen(msIP)){ printf("msIP:%s\n", msIP); } usleep(1000); return 0;}
Seraching...