35 #include <sys/types.h>
36 #include <sys/socket.h>
37 #include <netinet/in.h>
38 #include <arpa/inet.h>
45 #define MAXBUFLEN 5000
48 void *get_in_addr(
struct sockaddr *sa)
50 if (sa->sa_family == AF_INET) {
51 return &(((
struct sockaddr_in*)sa)->sin_addr);
54 return &(((
struct sockaddr_in6*)sa)->sin6_addr);
57 int makeSocket(
const char * ip,
int port,
struct addrinfo*& p)
60 struct addrinfo hints, *servinfo;
63 struct sockaddr_storage their_addr;
65 char s[INET6_ADDRSTRLEN];
67 memset(&hints, 0,
sizeof hints);
68 hints.ai_family = AF_UNSPEC;
69 hints.ai_socktype = SOCK_DGRAM;
71 sprintf(portStr,
"%d",port);
72 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) {
79 if ((sockfd = socket(p->ai_family, p->ai_socktype,
80 p->ai_protocol)) == -1) {
89 fprintf(stderr,
"sw: failed to create socket\n");
93 freeaddrinfo(servinfo);
98 int main(
int argc,
char** argv)
100 std::cout <<
"\n\n" << __FILE__ <<
"\tStarting...\n\n" << std::endl;
102 std::string myPort_(
"3000");
103 std::string myFwdPort_(
"3001");
104 std::string myFwdIP_(
"127.0.0.1");
107 std::cout <<
"\n\n" << __FILE__ <<
"\t port parameter file:" <<
108 argv[1] <<
"\n\n" << std::endl;
109 FILE *fp = fopen(argv[1],
"r");
113 char tmpParamStr[100];
115 sscanf(tmp,
"%*s %s",tmpParamStr);
116 myPort_ = tmpParamStr;
118 sscanf(tmp,
"%*s %s",tmpParamStr);
119 myFwdPort_ = tmpParamStr;
121 sscanf(tmp,
"%*s %s",tmpParamStr);
122 myFwdIP_ = tmpParamStr;
126 std::cout <<
"\n\n" << __FILE__ <<
"\t port parameter file failed to open: " <<
127 argv[1] <<
"\n\n" << std::endl;
130 std::cout <<
"\n\n" << __FILE__ <<
"\t Forwarding from: " << myPort_ <<
131 " to: " << myFwdIP_ <<
":" << myFwdPort_ <<
"\n\n" << std::endl;
134 sscanf(myFwdPort_.c_str(),
"%d",&myFwdPort);
139 struct addrinfo hints, *servinfo, *p;
142 struct sockaddr_storage their_addr;
143 char buff[MAXBUFLEN];
145 char s[INET6_ADDRSTRLEN];
147 memset(&hints, 0,
sizeof hints);
148 hints.ai_family = AF_UNSPEC;
149 hints.ai_socktype = SOCK_DGRAM;
150 hints.ai_flags = AI_PASSIVE;
152 if ((rv = getaddrinfo(
158 fprintf(stderr,
"getaddrinfo: %s\n", gai_strerror(rv));
163 for(p = servinfo; p != NULL; p = p->ai_next) {
164 if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
165 perror(
"listener: socket");
169 if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
171 perror(
"listener: bind");
179 fprintf(stderr,
"listener: failed to bind socket\n");
183 freeaddrinfo(servinfo);
193 uint64_t data_gen_cnt = 0;
194 uint64_t data_gen_rate = 1<<16;
195 uint8_t dataEnabled = 0;
197 const unsigned int RX_ADDR_OFFSET = 2;
198 const unsigned int RX_DATA_OFFSET = 10;
199 const unsigned int TX_DATA_OFFSET = 2;
201 unsigned int packetSz;
205 fd_set readfds, masterfds;
209 FD_SET(sockfd, &masterfds);
214 const int MF_POS_OF_TYPE = 5;
215 const int MF_POS_OF_MSG = 11;
216 bool firstPartPresent;
219 sendSockfd = makeSocket(myFwdIP_.c_str(), myFwdPort, p);
224 select(sockfd+1, &readfds, NULL, NULL, &tv);
226 if (FD_ISSET(sockfd, &readfds))
231 addr_len =
sizeof their_addr;
232 if ((numbytes = recvfrom(sockfd, buff, MAXBUFLEN-1 , 0,
233 (
struct sockaddr *)&their_addr, &addr_len)) == -1) {
260 buff[numbytes] =
'\0';
276 for(mf_p=0,mf_i=0;mf_i<numbytes && mf_p<MF_POS_OF_TYPE;++mf_i)
277 if(buff[mf_i] ==
'|') ++mf_p;
279 for(mf_j=mf_i;mf_j<numbytes && mf_p<MF_POS_OF_TYPE+1;++mf_j)
280 if(buff[mf_j] ==
'|') ++mf_p;
283 if(mf_i<mf_j && mf_j<numbytes)
286 std::cout << &buff[mf_i-1];
289 if(strcmp(&buff[mf_i-1],
"|Warning") != 0)
292 firstPartPresent =
true;
295 firstPartPresent =
false;
297 for(mf_i=mf_j;mf_i<numbytes && mf_p<MF_POS_OF_MSG;++mf_i)
298 if(buff[mf_i] ==
'|') ++mf_p;
302 std::cout << &buff[mf_i-1] << std::endl;
303 else if(firstPartPresent)
304 std::cout << std::endl;
313 if ((numbytes = sendto(sendSockfd, buff, numbytes, 0, p->ai_addr, p->ai_addrlen)) == -1) {
314 perror(
"hw: sendto");