/* ** udp_server.c ** ** Based on network_interface.c from the netvision program. ** ** Initiated: 9/6/05 */ #include #include #include #include #include #include #include #define MAX_PACKET_SIZE 80000 #define SOCK_PORT 5691 typedef struct { unsigned short sequence; unsigned short flags; unsigned long params; } MessageHeaderType; static int sock_fd, sock_port; static unsigned char buffer[MAX_PACKET_SIZE]; int get_packet(void *packet, int length) /* ** Receive a packet on the datagram socket, and place the packet in . */ { int n, cli_len; int echo_len = sizeof(MessageHeaderType); struct sockaddr_in cli_addr; cli_len = sizeof(cli_addr); n = recvfrom( sock_fd, (char *) packet, length, 0, (struct sockaddr *)&cli_addr, &cli_len ); if(n < 0) { perror("recvfrom"); return -1; } if(sendto( sock_fd, (char *) packet, echo_len, 0, (struct sockaddr *)&cli_addr, cli_len ) != echo_len) { perror("sendto"); return -1; } return n; } int socket_init(void) /* */ { struct sockaddr_in serv_addr; int one = 1; int i; /* ** Fill in some fields - */ sock_port = SOCK_PORT; sock_fd = -1; /* ** Open the UDP socket - */ sock_fd = socket(AF_INET, SOCK_DGRAM, 0); if(sock_fd < 0) { perror("socket"); return -1; } if(setsockopt( sock_fd, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one) ) < 0) { perror("setsockopt"); return -1; } /* ** Bind our local address so that the client can send to us - */ memset((char *) &serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(sock_port); if(bind( sock_fd, (struct sockaddr *) &serv_addr, sizeof(serv_addr) ) < 0) { perror("bind"); return -1; } return 0; } int main() { int i, n, total_bytes = 0; time_t start, run; double elapsed; if(socket_init() < 0) { printf("Error initializing UDP socket\n"); return 1; } printf("Elapsed Time\tTotal Bytes\tThroughput\n"); start = time(NULL); for(i = 1; ; i++) { n = get_packet(buffer, sizeof(buffer)); if(n < 0) { printf("get_packet returned error code %d\n", n); } else { total_bytes += n; } if((i % 1000) == 0) { run = time(NULL); elapsed = difftime(run, start); printf( "%g\t%d\t%g\n", elapsed, total_bytes, (double) total_bytes / elapsed ); } } return 0; }