29 #include <arpa/inet.h>
32 #include <netinet/in.h>
36 #include <sys/socket.h>
37 #include <sys/types.h>
43 #define MAXBUFLEN 5000
46 void* get_in_addr(
struct sockaddr* sa)
48 if(sa->sa_family == AF_INET)
50 return &(((
struct sockaddr_in*)sa)->sin_addr);
53 return &(((
struct sockaddr_in6*)sa)->sin6_addr);
56 int makeSocket(
const char* ip,
int port,
struct addrinfo*& p)
59 struct addrinfo hints, *servinfo;
62 struct sockaddr_storage their_addr;
64 char s[INET6_ADDRSTRLEN];
66 memset(&hints, 0,
sizeof hints);
67 hints.ai_family = AF_UNSPEC;
68 hints.ai_socktype = SOCK_DGRAM;
70 sprintf(portStr,
"%d", port);
71 if((rv = getaddrinfo(ip, portStr, &hints, &servinfo)) != 0)
73 fprintf(stderr,
"getaddrinfo: %s\n", gai_strerror(rv));
78 for(p = servinfo; p != NULL; p = p->ai_next)
80 if((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1)
91 fprintf(stderr,
"sw: failed to create socket\n");
95 freeaddrinfo(servinfo);
100 int main(
int argc,
char** argv)
102 std::cout <<
"\n\n" << __FILE__ <<
"\tStarting...\n\n" << std::endl;
104 std::string myPort_(
"3000");
105 std::string myFwdPort_(
"3001");
106 std::string myFwdIP_(
"127.0.0.1");
110 << __FILE__ <<
"\t port parameter file:" << argv[1] <<
"\n\n"
112 FILE* fp = fopen(argv[1],
"r");
116 char tmpParamStr[100];
118 sscanf(tmp,
"%*s %s", tmpParamStr);
119 myPort_ = tmpParamStr;
121 sscanf(tmp,
"%*s %s", tmpParamStr);
122 myFwdPort_ = tmpParamStr;
124 sscanf(tmp,
"%*s %s", tmpParamStr);
125 myFwdIP_ = tmpParamStr;
130 << __FILE__ <<
"\t port parameter file failed to open: " << argv[1]
135 << __FILE__ <<
"\t Forwarding from: " << myPort_ <<
" to: " << myFwdIP_
136 <<
":" << myFwdPort_ <<
"\n\n"
140 sscanf(myFwdPort_.c_str(),
"%d", &myFwdPort);
145 struct addrinfo hints, *servinfo, *p;
148 struct sockaddr_storage their_addr;
149 char buff[MAXBUFLEN];
151 char s[INET6_ADDRSTRLEN];
153 memset(&hints, 0,
sizeof hints);
154 hints.ai_family = AF_UNSPEC;
155 hints.ai_socktype = SOCK_DGRAM;
156 hints.ai_flags = AI_PASSIVE;
158 if((rv = getaddrinfo(NULL, myPort_.c_str(), &hints, &servinfo)) != 0)
160 fprintf(stderr,
"getaddrinfo: %s\n", gai_strerror(rv));
165 for(p = servinfo; p != NULL; p = p->ai_next)
167 if((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1)
169 perror(
"listener: socket");
173 if(bind(sockfd, p->ai_addr, p->ai_addrlen) == -1)
176 perror(
"listener: bind");
185 fprintf(stderr,
"listener: failed to bind socket\n");
189 freeaddrinfo(servinfo);
196 uint64_t data_gen_cnt = 0;
197 uint64_t data_gen_rate = 1 << 16;
198 uint8_t dataEnabled = 0;
200 const unsigned int RX_ADDR_OFFSET = 2;
201 const unsigned int RX_DATA_OFFSET = 10;
202 const unsigned int TX_DATA_OFFSET = 2;
204 unsigned int packetSz;
208 fd_set readfds, masterfds;
212 FD_SET(sockfd, &masterfds);
216 int mf_p, mf_i, mf_j;
217 const int MF_POS_OF_TYPE = 5;
218 const int MF_POS_OF_MSG = 11;
219 bool firstPartPresent;
222 sendSockfd = makeSocket(myFwdIP_.c_str(), myFwdPort, p);
227 select(sockfd + 1, &readfds, NULL, NULL, &tv);
229 if(FD_ISSET(sockfd, &readfds))
234 addr_len =
sizeof their_addr;
235 if((numbytes = recvfrom(sockfd,
239 (
struct sockaddr*)&their_addr,
263 buff[numbytes] =
'\0';
279 for(mf_p = 0, mf_i = 0; mf_i < numbytes && mf_p < MF_POS_OF_TYPE; ++mf_i)
280 if(buff[mf_i] ==
'|')
283 for(mf_j = mf_i; mf_j < numbytes && mf_p < MF_POS_OF_TYPE + 1; ++mf_j)
284 if(buff[mf_j] ==
'|')
288 if(mf_i < mf_j && mf_j < numbytes)
290 buff[mf_j - 1] =
'\0';
291 std::cout << &buff[mf_i - 1];
294 if(strcmp(&buff[mf_i - 1],
"|Warning") != 0)
297 firstPartPresent =
true;
300 firstPartPresent =
false;
302 for(mf_i = mf_j; mf_i < numbytes && mf_p < MF_POS_OF_MSG; ++mf_i)
303 if(buff[mf_i] ==
'|')
308 std::cout << &buff[mf_i - 1] << std::endl;
309 else if(firstPartPresent)
310 std::cout << std::endl;
314 if((numbytes = sendto(
315 sendSockfd, buff, numbytes, 0, p->ai_addr, p->ai_addrlen)) == -1)
317 perror(
"hw: sendto");