Generator::Generator(const char *src, const char *dst) { sockraw = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); socket_broadcast(sockraw); /* set SO_IPHDRINCL option */ socket_iphdrincl(sockraw); src_addr.sin_family = AF_INET; src_addr.sin_addr.s_addr = inet_addr(src); src_addr.sin_port = htons(9095); memset(&src_addr.sin_zero, '\0', 8); dest_addr.sin_family = AF_INET; dest_addr.sin_addr.s_addr = inet_addr(dst); dest_addr.sin_port = htons(9095); memset(&dest_addr.sin_zero, '\0', 8); /* if(bind(sockraw, (struct sockaddr *)&src_addr, sizeof(struct sockaddr)) == -1) { perror("bind"); //return -1; } */ //return 0; }
int main(int argc, char *argv[]) { if (argc != 2) { printf("Usage: %s PORT\n", argv[0]); exit(1); } int sock_udp = socket(AF_INET, SOCK_DGRAM, 0); if (sock_udp == -1) { perror("socket"); exit(1); } int sock_raw = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); if (sock_raw == -1) { perror("socket"); exit(1); } socket_iphdrincl(sock_raw); struct sockaddr_in local = {0}; local.sin_family=AF_INET; local.sin_port=htons(atoi(argv[1])); local.sin_addr.s_addr=INADDR_ANY; bind(sock_udp,(struct sockaddr*)&local,sizeof(local)); struct sockaddr_in sa = {0}; sa.sin_family = AF_INET; int total = 0; while (1) { unsigned char buf[2048]; int len = recv(sock_udp, buf, sizeof(buf), 0); printf("forward packet, size = %d, total = %d KB\n", len, (total += len) / 1024); int i; for (i=0; i<len; i++) buf[i] ^= 0x5a; sa.sin_addr.s_addr = *(unsigned int *)&buf[16]; sendto(sock_raw, buf, len, 0, (struct sockaddr*)&sa, sizeof(sa)); } return 0; }