#include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> #include<sys/socket.h> #include<sys/wait.h> #include<netinet/in.h> #include<arpa/inet.h> #include<errno.h> #include<pthread.h> #define serverBroadPort 9989 struct dataOfBroadInit{ int broadFd; struct sockaddr_in serviceAddr; }; //struct dataOfBroadInit *communData; static struct dataOfBroadInit *initData; static int broadCast(){ int recvbytes=0,addrLen=sizeof(struct sockaddr_in);; char msg[128] = "I am broadCast message from client!"; char recvbuf[128]; if((sendto(initData->broadFd,msg,strlen(msg),0,(struct sockaddr *)&initData->serviceAddr,sizeof(struct sockaddr))) == -1){ printf("sendBroad fail:%s\n",strerror(errno)); return -1; } if((recvbytes = recvfrom(initData->broadFd, recvbuf,128,0,(struct sockaddr *)&initData->serviceAddr, &addrLen)) != -1){ recvbuf[recvbytes] = '\0'; printf("receive a messgse:%s\n", recvbuf); printf("receive from:%s:%d\n\n\n\n",inet_ntoa(initData->serviceAddr.sin_addr),ntohs(initData->serviceAddr.sin_port)); }else{ printf("recvfrom fail:%s\n",strerror(errno)); return -1; } printf("broadcast Over!\n"); return 0; } int broadInit(void){ //struct dataOfBroadInit *initData=NULL; initData=NULL; int optval=1; initData = malloc(sizeof(struct dataOfBroadInit)); if(NULL==initData){ printf("malloc err: %s\n",strerror(errno)); return -1; } memset(initData,0,sizeof(struct dataOfBroadInit)); if((initData->broadFd = socket(PF_INET, SOCK_DGRAM, 0)) == -1){ printf("get socketFd fail\n"); return -1; } setsockopt(initData->broadFd, SOL_SOCKET, SO_BROADCAST | SO_REUSEADDR, &optval, sizeof(int)); bzero(&initData->serviceAddr,sizeof(struct sockaddr_in)); initData->serviceAddr.sin_family = AF_INET; printf("cc\n"); initData->serviceAddr.sin_addr.s_addr = inet_addr("255.255.255.255"); initData->serviceAddr.sin_port = htons(serverBroadPort); if(broadCast() != 0){ printf("broadCast err\n"); return -1; } return 0; } int nativeSendCmd(const int cmd){ if(cmd!=111&&cmd!=112){ printf("cmd err\n"); return -1; } if((sendto(initData->broadFd,&cmd,sizeof(int),0,(struct sockaddr *)&initData->serviceAddr,sizeof(struct sockaddr))) == -1){ printf("sendMesg fail:%s\n",strerror(errno)); return -1; } return 0; } int main(){ //pthread_t pid; //向服務器發送廣播 /* communData=NULL; communData = broadInit(); if(NULL==communData){ printf("broadInit err:%s\n",strerror(errno)); return -1; } printf("broadcast Over!\n"); //已建立連接,開始交流數據 //nativeWriteCmd(112);*/ broadInit(); return 0; } /************************************************* //service_端 **************************************************/ #include<stdlib.h> #include<stdio.h> #include<string.h> #include<sys/types.h> #include<netinet/in.h> #include<netdb.h> #include<sys/socket.h> #include<sys/wait.h> #include<arpa/inet.h> #include<errno.h> #define serverBroadPort 9989 int main(void){ int sockListen; char msg[128] = "I am message from service to u!"; if((sockListen = socket(AF_INET, SOCK_DGRAM, 0)) == -1){ printf("socket fail\n"); return -1; } int set = 1; setsockopt(sockListen, SOL_SOCKET, SO_REUSEADDR, &set, sizeof(int)); struct sockaddr_in recvAddr; memset(&recvAddr, 0, sizeof(struct sockaddr_in)); recvAddr.sin_family = AF_INET; recvAddr.sin_port = htons(serverBroadPort); recvAddr.sin_addr.s_addr = INADDR_ANY; if(bind(sockListen, (struct sockaddr *)&recvAddr, sizeof(struct sockaddr)) == -1){ printf("bind fail\n"); return -1; } int recvbytes; char recvbuf[128]; int addrLen = sizeof(struct sockaddr_in); if((recvbytes = recvfrom(sockListen, recvbuf,128,0,(struct sockaddr *)&recvAddr, &addrLen)) != -1){ recvbuf[recvbytes] = '\0'; printf("receive a broadCast messgse:%s\n", recvbuf); printf("receive from:%s:%d\n\n\n\n",inet_ntoa(recvAddr.sin_addr),ntohs(recvAddr.sin_port)); }else{ printf("recvfrom fail\n"); } int sendRet; if((sendRet = sendto(sockListen,msg,strlen(msg),0,(struct sockaddr *)&recvAddr,sizeof(struct sockaddr))) == -1){ printf("sendToClient fail:%s\n",strerror(errno)); return -1; } printf("sucessfully send mesg to Client\n\n"); close(sockListen); return 0; }