29 #include <arpa/inet.h>
32 #include <netinet/in.h>
36 #include <sys/socket.h>
37 #include <sys/types.h>
43 #define MAXBUFLEN 5000
45 #define __MF_SUBJECT__ "mfReceiveAndForward"
50 #define __SHORTFILE__ \
51 (strstr(&__FILE__[0], "/srcs/") ? strstr(&__FILE__[0], "/srcs/") + 6 : __FILE__)
54 #define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
56 #define __E__ std::endl
58 #define __COUT_HDR_F__ __SHORTFILE__ << "\t"
59 #define __COUT_HDR_L__ "[" << std::dec << __LINE__ << "]\t"
60 #define __COUT_HDR_P__ __PRETTY_FUNCTION__ << "\t"
61 #define __COUT_HDR_FL__ __SHORTFILE__ << " " << __COUT_HDR_L__
62 #define __COUT_HDR_FP__ __SHORTFILE__ << " : " << __COUT_HDR_P__
63 #define __COUT_HDR__ __COUT_HDR_FL__
65 #define __COUT_TYPE__(X) std::cout << QUOTE(X) << ":" << __MF_SUBJECT__ << ":"
67 #define __COUT_ERR__ __COUT_TYPE__(LogError) << __COUT_HDR__
68 #define __COUT_WARN__ __COUT_TYPE__(LogWarning) << __COUT_HDR__
69 #define __COUT_INFO__ __COUT_TYPE__(LogInfo) << __COUT_HDR__
70 #define __COUT__ __COUT_TYPE__(LogDebug) << __COUT_HDR__
71 #define __COUTV__(X) __COUT__ << QUOTE(X) << " = " << X << __E__
74 void* get_in_addr(
struct sockaddr* sa)
76 if(sa->sa_family == AF_INET)
78 return &(((
struct sockaddr_in*)sa)->sin_addr);
81 return &(((
struct sockaddr_in6*)sa)->sin6_addr);
84 int makeSocket(
const char* ip,
int port,
struct addrinfo*& p)
87 struct addrinfo hints, *servinfo;
90 struct sockaddr_storage their_addr;
92 char s[INET6_ADDRSTRLEN];
94 memset(&hints, 0,
sizeof hints);
95 hints.ai_family = AF_UNSPEC;
96 hints.ai_socktype = SOCK_DGRAM;
98 sprintf(portStr,
"%d", port);
99 if((rv = getaddrinfo(ip, portStr, &hints, &servinfo)) != 0)
101 fprintf(stderr,
"getaddrinfo: %s\n", gai_strerror(rv));
106 for(p = servinfo; p != NULL; p = p->ai_next)
108 if((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1)
110 perror(
"sw: socket");
119 fprintf(stderr,
"sw: failed to create socket\n");
123 freeaddrinfo(servinfo);
128 int main(
int argc,
char** argv)
130 __COUT__ <<
"Starting...\n\n" << __E__;
132 std::string myPort_(
"3000");
133 std::string myFwdPort_(
"3001");
134 std::string myFwdIP_(
"127.0.0.1");
137 __COUT__ <<
"port parameter file:" << argv[1] <<
"\n\n" << __E__;
138 FILE* fp = fopen(argv[1],
"r");
142 char tmpParamStr[100];
144 sscanf(tmp,
"%*s %s", tmpParamStr);
145 myPort_ = tmpParamStr;
147 sscanf(tmp,
"%*s %s", tmpParamStr);
148 myFwdPort_ = tmpParamStr;
150 sscanf(tmp,
"%*s %s", tmpParamStr);
151 myFwdIP_ = tmpParamStr;
155 __COUT__ <<
"port parameter file failed to open: " << argv[1] <<
"\n\n"
158 __COUT__ <<
"Forwarding from: " << myPort_ <<
" to: " << myFwdIP_ <<
":" << myFwdPort_
163 sscanf(myFwdPort_.c_str(),
"%d", &myFwdPort);
168 struct addrinfo hints, *servinfo, *p;
171 struct sockaddr_storage their_addr;
172 char buff[MAXBUFLEN];
174 char s[INET6_ADDRSTRLEN];
176 memset(&hints, 0,
sizeof hints);
177 hints.ai_family = AF_UNSPEC;
178 hints.ai_socktype = SOCK_DGRAM;
179 hints.ai_flags = AI_PASSIVE;
181 if((rv = getaddrinfo(NULL, myPort_.c_str(), &hints, &servinfo)) != 0)
183 fprintf(stderr,
"getaddrinfo: %s\n", gai_strerror(rv));
188 for(p = servinfo; p != NULL; p = p->ai_next)
190 if((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1)
192 __COUT__ <<
"listener: socket...\n\n" << __E__;
193 perror(
"listener: socket");
197 if(bind(sockfd, p->ai_addr, p->ai_addrlen) == -1)
200 __COUT__ <<
"listener: bind.\n\n" << __E__;
201 perror(
"listener: bind");
210 __COUT__ <<
"listener: failed to bind socket...\n\n" << __E__;
211 fprintf(stderr,
"listener: failed to bind socket\n");
215 freeaddrinfo(servinfo);
222 uint64_t data_gen_cnt = 0;
223 uint64_t data_gen_rate = 1 << 16;
224 uint8_t dataEnabled = 0;
226 const unsigned int RX_ADDR_OFFSET = 2;
227 const unsigned int RX_DATA_OFFSET = 10;
228 const unsigned int TX_DATA_OFFSET = 2;
230 unsigned int packetSz;
234 fd_set readfds, masterfds;
238 FD_SET(sockfd, &masterfds);
242 int mf_p, mf_i, mf_j;
243 const int MF_POS_OF_TYPE = 5;
244 const int MF_POS_OF_MSG = 11;
245 bool firstPartPresent;
248 sendSockfd = makeSocket(myFwdIP_.c_str(), myFwdPort, p);
253 select(sockfd + 1, &readfds, NULL, NULL, &tv);
255 if(FD_ISSET(sockfd, &readfds))
260 addr_len =
sizeof their_addr;
261 if((numbytes = recvfrom(sockfd,
265 (
struct sockaddr*)&their_addr,
268 __COUT__ <<
"error: recvfrom...\n\n" << __E__;
290 buff[numbytes] =
'\0';
309 for(mf_p = 0, mf_i = 0; mf_i < numbytes && mf_p < MF_POS_OF_TYPE; ++mf_i)
310 if(buff[mf_i] ==
'|')
313 for(mf_j = mf_i; mf_j < numbytes && mf_p < MF_POS_OF_TYPE + 1; ++mf_j)
314 if(buff[mf_j] ==
'|')
318 if(mf_i < mf_j && mf_j < numbytes)
320 char sav = buff[mf_j - 1];
321 buff[mf_j - 1] =
'\0';
322 std::cout << &buff[mf_i - 1];
323 buff[mf_j - 1] = sav;
326 if(strcmp(&buff[mf_i - 1],
"|Warning") != 0)
329 firstPartPresent =
true;
332 firstPartPresent =
false;
334 for(mf_i = mf_j; mf_i < numbytes && mf_p < MF_POS_OF_MSG; ++mf_i)
335 if(buff[mf_i] ==
'|')
340 std::cout << &buff[mf_i - 1] << __E__;
341 else if(firstPartPresent)
346 if((numbytes = sendto(
347 sendSockfd, buff, numbytes, 0, p->ai_addr, p->ai_addrlen)) == -1)
349 __COUT__ <<
"error: sendto...\n\n" << __E__;
350 perror(
"hw: sendto");
362 __COUT__ <<
"Exited.\n\n" << __E__;