00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include <iostream>
00030 #include <stdio.h>
00031 #include <stdlib.h>
00032 #include <unistd.h>
00033 #include <errno.h>
00034 #include <string.h>
00035 #include <sys/types.h>
00036 #include <sys/socket.h>
00037 #include <netinet/in.h>
00038 #include <arpa/inet.h>
00039 #include <netdb.h>
00040
00041
00042 using namespace std;
00043
00044
00045 #define MAXBUFLEN 5000
00046
00047
00048 void *get_in_addr(struct sockaddr *sa)
00049 {
00050 if (sa->sa_family == AF_INET) {
00051 return &(((struct sockaddr_in*)sa)->sin_addr);
00052 }
00053
00054 return &(((struct sockaddr_in6*)sa)->sin6_addr);
00055 }
00056
00057 int makeSocket(const char * ip, int port, struct addrinfo*& p)
00058 {
00059 int sockfd;
00060 struct addrinfo hints, *servinfo;
00061 int rv;
00062 int numbytes;
00063 struct sockaddr_storage their_addr;
00064 socklen_t addr_len;
00065 char s[INET6_ADDRSTRLEN];
00066
00067 memset(&hints, 0, sizeof hints);
00068 hints.ai_family = AF_UNSPEC;
00069 hints.ai_socktype = SOCK_DGRAM;
00070 char portStr[10];
00071 sprintf(portStr,"%d",port);
00072 if ((rv = getaddrinfo(ip, portStr, &hints, &servinfo)) != 0) {
00073 fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
00074 return 1;
00075 }
00076
00077
00078 for(p = servinfo; p != NULL; p = p->ai_next) {
00079 if ((sockfd = socket(p->ai_family, p->ai_socktype,
00080 p->ai_protocol)) == -1) {
00081 perror("sw: socket");
00082 continue;
00083 }
00084
00085 break;
00086 }
00087
00088 if (p == NULL) {
00089 fprintf(stderr, "sw: failed to create socket\n");
00090 return 2;
00091 }
00092
00093 freeaddrinfo(servinfo);
00094
00095 return sockfd;
00096 }
00097
00098 int main(int argc, char** argv)
00099 {
00100 std::cout << "\n\n" << __FILE__ << "\tStarting...\n\n" << std::endl;
00101
00102 std::string myPort_("3000");
00103 std::string myFwdPort_("3001");
00104 std::string myFwdIP_("127.0.0.1");
00105 if(argc >= 2)
00106 {
00107 std::cout << "\n\n" << __FILE__ << "\t port parameter file:" <<
00108 argv[1] << "\n\n" << std::endl;
00109 FILE *fp = fopen(argv[1],"r");
00110 if(fp)
00111 {
00112 char tmp[100];
00113 char tmpParamStr[100];
00114 fgets(tmp,100,fp);
00115 sscanf(tmp,"%*s %s",tmpParamStr);
00116 myPort_ = tmpParamStr;
00117 fgets(tmp,100,fp);
00118 sscanf(tmp,"%*s %s",tmpParamStr);
00119 myFwdPort_ = tmpParamStr;
00120 fgets(tmp,100,fp);
00121 sscanf(tmp,"%*s %s",tmpParamStr);
00122 myFwdIP_ = tmpParamStr;
00123 fclose(fp);
00124 }
00125 else
00126 std::cout << "\n\n" << __FILE__ << "\t port parameter file failed to open: " <<
00127 argv[1] << "\n\n" << std::endl;
00128
00129 }
00130 std::cout << "\n\n" << __FILE__ << "\t Forwarding from: " << myPort_ <<
00131 " to: " << myFwdIP_ << ":" << myFwdPort_ << "\n\n" << std::endl;
00132
00133 int myFwdPort;
00134 sscanf(myFwdPort_.c_str(),"%d",&myFwdPort);
00135
00136 int sockfd;
00137 int sendSockfd=0;
00138
00139 struct addrinfo hints, *servinfo, *p;
00140 int rv;
00141 int numbytes;
00142 struct sockaddr_storage their_addr;
00143 char buff[MAXBUFLEN];
00144 socklen_t addr_len;
00145 char s[INET6_ADDRSTRLEN];
00146
00147 memset(&hints, 0, sizeof hints);
00148 hints.ai_family = AF_UNSPEC;
00149 hints.ai_socktype = SOCK_DGRAM;
00150 hints.ai_flags = AI_PASSIVE;
00151
00152 if ((rv = getaddrinfo(
00153 NULL,
00154 myPort_.c_str(),
00155 &hints,
00156 &servinfo)) != 0)
00157 {
00158 fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
00159 return 1;
00160 }
00161
00162
00163 for(p = servinfo; p != NULL; p = p->ai_next) {
00164 if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
00165 perror("listener: socket");
00166 continue;
00167 }
00168
00169 if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
00170 close(sockfd);
00171 perror("listener: bind");
00172 continue;
00173 }
00174
00175 break;
00176 }
00177
00178 if (p == NULL) {
00179 fprintf(stderr, "listener: failed to bind socket\n");
00180 return 2;
00181 }
00182
00183 freeaddrinfo(servinfo);
00184
00188
00189
00190
00191
00192
00193 uint64_t data_gen_cnt = 0;
00194 uint64_t data_gen_rate = 1<<16;
00195 uint8_t dataEnabled = 0;
00196
00197 const unsigned int RX_ADDR_OFFSET = 2;
00198 const unsigned int RX_DATA_OFFSET = 10;
00199 const unsigned int TX_DATA_OFFSET = 2;
00200
00201 unsigned int packetSz;
00202
00203
00204 struct timeval tv;
00205 fd_set readfds, masterfds;
00206 tv.tv_sec = 0;
00207 tv.tv_usec = 500000;
00208 FD_ZERO(&masterfds);
00209 FD_SET(sockfd, &masterfds);
00210
00211 time_t count = 0;
00212
00213 int mf_p,mf_i,mf_j;
00214 const int MF_POS_OF_TYPE = 5;
00215 const int MF_POS_OF_MSG = 11;
00216 bool firstPartPresent;
00217
00218
00219 sendSockfd = makeSocket(myFwdIP_.c_str(), myFwdPort, p);
00220
00221 while(1)
00222 {
00223 readfds = masterfds;
00224 select(sockfd+1, &readfds, NULL, NULL, &tv);
00225
00226 if (FD_ISSET(sockfd, &readfds))
00227 {
00228
00229
00230
00231 addr_len = sizeof their_addr;
00232 if ((numbytes = recvfrom(sockfd, buff, MAXBUFLEN-1 , 0,
00233 (struct sockaddr *)&their_addr, &addr_len)) == -1) {
00234 perror("recvfrom");
00235 exit(1);
00236 }
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260 buff[numbytes] = '\0';
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276 for(mf_p=0,mf_i=0;mf_i<numbytes && mf_p<MF_POS_OF_TYPE;++mf_i)
00277 if(buff[mf_i] == '|') ++mf_p;
00278
00279 for(mf_j=mf_i;mf_j<numbytes && mf_p<MF_POS_OF_TYPE+1;++mf_j)
00280 if(buff[mf_j] == '|') ++mf_p;
00281
00282
00283 if(mf_i<mf_j && mf_j<numbytes)
00284 {
00285 buff[mf_j-1] = '\0';
00286 std::cout << &buff[mf_i-1];
00287
00288
00289 if(strcmp(&buff[mf_i-1],"|Warning") != 0)
00290 std::cout << "\t";
00291
00292 firstPartPresent = true;
00293 }
00294 else
00295 firstPartPresent = false;
00296
00297 for(mf_i=mf_j;mf_i<numbytes && mf_p<MF_POS_OF_MSG;++mf_i)
00298 if(buff[mf_i] == '|') ++mf_p;
00299
00300
00301 if(mf_i<numbytes)
00302 std::cout << &buff[mf_i-1] << std::endl;
00303 else if(firstPartPresent)
00304 std::cout << std::endl;
00305
00306
00307
00308
00309
00310
00311
00312
00313 if ((numbytes = sendto(sendSockfd, buff, numbytes, 0, p->ai_addr, p->ai_addrlen)) == -1) {
00314 perror("hw: sendto");
00315 exit(1);
00316 }
00317
00318
00319 }
00320 else
00321 sleep(1);
00322 }
00323
00324 close(sockfd);
00325 close(sendSockfd);
00326
00327 return 0;
00328 }
00329