struct result_def udp_sender_plain( unsigned long ip, unsigned short port, char *buff, int dsize, int bsize, int (* callback)(void)) { struct internal_command_def command; command.buff = buff; command.bsize = bsize; command.dsize = dsize; command.ip = ip; command.port = port; command.callback = callback; return(udp_sender(&command)); }
int main(int argc, char **argv) { int sendfd, recvfd; const int on = 1; socklen_t salen; struct sockaddr *sasend, *sarecv; int result; int onoff = 0; if (argc != 3) { printf("usage: ./multicasting <IP-multicast-address> <port#> <>"); exit(1); } sendfd = udp_sender(argv[1], argv[2], &sasend, &salen); recvfd = socket(sasend->sa_family, SOCK_DGRAM, 0); assert(recvfd > 2); // Now IP from iface // int fd; // struct ifreq ifr; // fd = socket(AF_INET, SOCK_DGRAM, 0); // /* I want to get an IPv4 IP address */ // ifr.ifr_addr.sa_family = AF_INET; // /* I want IP address attached to "eth0" */ // strncpy(ifr.ifr_name, "enp0s25", IFNAMSIZ-1); // ioctl(fd, SIOCGIFADDR, &ifr); // close(fd); /* display result */ //printf("%s\n", inet_ntoa( ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr) ); // I don't want default iface but wlo1 result = setsockopt(recvfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); assert(result >= 0); sarecv = malloc(salen); assert(sarecv != NULL); memcpy(sarecv, sasend, salen); result = bind(recvfd, sarecv, salen); assert(result >= 0); char *src_host = sock_ntop(sarecv); printf("src_host = %s\n", src_host); char *dst_host = sock_ntop(sasend); printf("dst_host = %s\n", dst_host); result = mcast_join(recvfd, sasend, salen); assert(result >= 0); result = setsockopt(sendfd, IPPROTO_IP, IP_MULTICAST_LOOP, &onoff, sizeof(onoff)); assert(result >= 0); // struct in_addr interface_addr;// = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr; // interface_addr.s_addr = htonl(IP_SRC_ADDR_ENP); // result = setsockopt(recvfd, IPPROTO_IP, IP_MULTICAST_IF, &interface_addr, sizeof(interface_addr)); // assert(result >= 0); if (fork() == 0) recv_all(recvfd, salen); send_all(sendfd, sasend, salen); return 0; }
int main(int argc, char *argv[]) { struct ip_addr peer_ip; // IP address of peer uint16_t port = 0; // Port number of the peer ws = get_default_waitset(); // Parse args if (argc != 5) { printf("Usage: %s <direction> <IP> <Port> <packets * %d>\n", argv[0], MULTIPLIER); printf("eg (to send microbenchmark): %s 1 10.110.4.41 3000 1000\n", argv[0]); printf("eg (to recv microbenchmark): %s 0 10.110.4.41 3000 1000\n", argv[0]); return 1; } // Flag to choose between sender(1) and receiver(0) int as_sender = atoi(argv[1]); struct in_addr peer_ip_gen; int ret = inet_aton(argv[2], &peer_ip_gen); if (ret == 0) { printf("Invalid IP addr: %s\n", argv[2]); return 1; } // end if : ip validation peer_ip.addr = peer_ip_gen.s_addr; port = atoi(argv[3]); if (port <= 0) { printf("Invalid port given [%s] == [%"PRIu16"]\n", argv[3], port); return 1; } // end if : port validation iterations = atoi(argv[4]); if (iterations <= 0) { printf("Invalid no. of iterations [%s] == [%"PRIu64"]\n", argv[4], iterations); return 1; } // end if : port validation iterations = iterations * MULTIPLIER; if (lwip_init_auto() == false) { printf("ERROR: lwip_init_auto failed!\n"); return 1; } // lwip_init("e1000"); // create pcb for connection struct udp_pcb *upcb; upcb = udp_new(); assert(upcb != NULL); printf("U: #####################################\n"); printf("U: %d.%"PRIuDOMAINID": Performing [%"PRIu64"] iterations\n", disp_get_core_id(), disp_get_domain_id(), iterations); #if UDP_BENCHMARK_TRACE errval_t err = trace_control(TRACE_EVENT(TRACE_SUBSYS_BNET, TRACE_EVENT_BNET_START, 0), TRACE_EVENT(TRACE_SUBSYS_BNET, TRACE_EVENT_BNET_STOP, 0), 0); if(err_is_fail(err)) { USER_PANIC_ERR(err, "trace_control failed"); } printf("U: Tracing enabled!!!!\n"); // trace_event(TRACE_SUBSYS_BNET, TRACE_EVENT_BNET_START, 0); #endif // UDP_BENCHMARK_TRACE if(as_sender == 1) { udp_sender(upcb, peer_ip, port); } else { udp_receiver(upcb, IP_ADDR_ANY, port); } // end else: printf("U: Init finished.\n"); while (1) { errval_t r = event_dispatch(ws); if (err_is_fail(r)) { DEBUG_ERR(r, "in event_dispatch"); break; } } udp_remove(upcb); } // end function: main