📄 proxy.c
字号:
#include <sys/types.h>#include <sys/select.h>#include <sys/socket.h>#include <netinet/in.h>#include <sys/file.h>#include <unistd.h>#include <sys/ioctl.h>#include <string.h>#define SERV_PORT 5678//the port opened for server#define CONN_PORT 5666 //the port to recieve the connect message#define STYLE_ConnMsg 0x03#define MAXLEN 1024//the max length for read or write data once/////////////////////////////////////////////////////////////////////struct RegMsg{ //the register message struct form proxy int code; unsigned long sta_addr; unsigned long regAgent_addr;};struct ConnMsg{ int code; unsigned long sta_addr; unsigned long ap_addr;};///////////////////////////////////////////////////////////////////////void setStaRoute(unsigned long sta,unsigned long ap);int check_msg(char *buf);//////////////////////////////////////////////////////////////////////void setStaRoute(unsigned long sta,unsigned long ap){ struct in_addr inaddr1,inaddr2; char *net_sta, *ip_ap; unsigned long netmask,sta_net; char command[1024]; netmask=0; sta_net=0; memset(command,0,1024); memset(&inaddr1,0,sizeof(inaddr1)); memset(&inaddr2,0,sizeof(inaddr2)); netmask=0<<24|255<<16|255<<8|255; sta_net=sta&netmask; inaddr1.s_addr=sta_net; inaddr2.s_addr=ap; net_sta=(char*)inet_ntoa(inaddr1); ip_ap=(char*)inet_ntoa(inaddr2); system("echo '1' > /proc/sys/net/ipv4/ip_forward"); sprintf(command,"route add -net %s netmask 255.255.255.0 gw %s dev eth0",net_sta,ip_ap); system(command); }/////////////////////////////////////////////////////////////////////////////int check_msg(char *buf){ if(buf[0]==STYLE_ConnMsg) return 0; else return -1; }///////////////////////////////////////////////////////////////////////int main(int argc,char ** argv){ int maxfd; int listen_fd; int sock_test; int nonBlock; //the variable to set socket non-blocked fd_set readset,writeset; int recv_len,recv_n; char recvs[MAXLEN]; char buffer[MAXLEN]; struct sockaddr_in serv_addr,recv_addr; struct sockaddr_in reg_addr; struct ConnMsg *pMsg; struct RegMsg regmsg; ///////////////////////////////////////////initialize the variables recv_len=0; recv_n=0; nonBlock=1; memset(recvs,0, MAXLEN); memset(®msg,0,sizeof(regmsg)); memset(buffer,0,MAXLEN); ////////////////////////////////////////////////////////////////////////// listen_fd=socket(AF_INET,SOCK_DGRAM,0); if(listen_fd<0) { printf("socket() failed with error!\n"); exit(1); } else printf("socket() success\n"); serv_addr.sin_family=AF_INET; serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); serv_addr.sin_port=htons(CONN_PORT); bzero(&(serv_addr.sin_zero),8); reg_addr.sin_family=AF_INET; reg_addr.sin_port=htons(SERV_PORT); reg_addr.sin_addr.s_addr=htonl(INADDR_ANY); bzero(&(reg_addr.sin_zero),8); sock_test=bind(listen_fd,(struct sockaddr*)&serv_addr,sizeof(struct sockaddr)); if(sock_test<0) { printf("bind() failed with error!\n"); exit(1); } else printf("bind() success\n"); //set the listen socket listen_fd as nonblock socket ioctl(listen_fd,FIONBIO,&nonBlock); //now set the parameter of select() if(maxfd<listen_fd) maxfd=listen_fd; while(1) { FD_ZERO(&readset); FD_ZERO(&writeset); FD_SET(listen_fd,&readset); select(maxfd+1,&readset,NULL,NULL,NULL); if(FD_ISSET(listen_fd,&readset)) { memset(recvs,0,MAXLEN); recv_len=sizeof(recv_addr); bzero(&recv_addr,sizeof(recv_addr)); recv_n=recvfrom(listen_fd,recvs,MAXLEN,0,(struct sockaddr*)&recv_addr,&recv_len); if(recv_n<0) { printf("recvfrom error!\n"); exit(1); } if(check_msg(recvs)==0) //it is the connect message from ap { pMsg=(struct ConnMsg*)recvs; setStaRoute(pMsg->sta_addr,pMsg->ap_addr); regmsg.code=0x04; regmsg.sta_addr=pMsg->sta_addr; regmsg.regAgent_addr=htonl(INADDR_ANY); memcpy(buffer,®msg,sizeof(regmsg)); sendto(listen_fd,buffer,MAXLEN,0,(struct sockaddr*)®_addr,sizeof(reg_addr)); }// printf("the recv_addr is %s\n",inet_ntoa(recv_addr.sin_addr.s_addr)); // sendto(listen_fd,sends,strlen(sends),0,(struct sockaddr *)&recv_addr,recv_len); } } close(listen_fd); return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -