1e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* this program is used to test UDP networking in Android. 2e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * used to debug the emulator's networking implementation 3e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project */ 4e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PROGNAME "test_udp" 5e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define DEFAULT_PORT 7000 6e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 7e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <arpa/inet.h> 8e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <netinet/in.h> 9e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdio.h> 10e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdlib.h> 11e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <sys/types.h> 12e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <sys/socket.h> 13e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <unistd.h> 14e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <string.h> 15e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 16e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define BUFLEN 512 17e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define NPACK 10 18e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 19e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectvoid diep(char *s) 20e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 21e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project perror(s); 22e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project exit(1); 23e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 24e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 25e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void 26e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectusage(int code) 27e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 28e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("usage: %s [options]\n", PROGNAME); 29e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("options:\n"); 30e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf(" -p<port> use specific port (default %d)\n", DEFAULT_PORT); 31e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf(" -a<inet> use specific IP address\n"); 32e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf(" -s run server (default is client)\n"); 33e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project exit(code); 34e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 35e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 36e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint main(int argc, char** argv) 37e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 38e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int runServer = 0; 39e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int udpPort = DEFAULT_PORT; 40e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int useLocal = 0; 41e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int address = htonl(INADDR_ANY); 42e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 43e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project struct sockaddr_in si_me, si_other; 44e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int s, i, slen=sizeof(si_other); 45e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char buf[BUFLEN]; 46e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 47e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project while (argc > 1 && argv[1][0] == '-') { 48e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const char* optName = argv[1]+1; 49e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project argc--; 50e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project argv++; 51e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 52e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project switch (optName[0]) { 53e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project case 'p': 54e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project udpPort = atoi(optName+1); 55e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (udpPort < 1024 || udpPort > 65535) { 56e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, "UDP port must be between 1024 and 65535\n"); 57e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project exit(1); 58e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 59e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 60e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 61e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project case 's': 62e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project runServer = 1; 63e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 64e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 65e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project case 'a': 66e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (inet_aton(optName+1, &si_other.sin_addr) == 0) 67e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project diep("inet_aton"); 68e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project address = si_other.sin_addr.s_addr; 69e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 70e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 71e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project default: 72e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usage(1); 73e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 74e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 75e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 76e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (runServer) { 77e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1) 78e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project diep("socket"); 79e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 80e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project memset((char *) &si_me, 0, sizeof(si_me)); 81e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project si_me.sin_family = AF_INET; 82e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project si_me.sin_port = htons(udpPort); 83e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project si_me.sin_addr.s_addr = address; 84e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (bind(s, (struct sockaddr*)&si_me, sizeof(si_me))==-1) 85e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project diep("bind"); 86e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 87e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("UDP server listening on %s:%d\n", inet_ntoa(si_me.sin_addr), udpPort); 88e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (i=0; i<NPACK; i++) { 89e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (recvfrom(s, buf, BUFLEN, 0, (struct sockaddr*)&si_other, (socklen_t*)&slen)==-1) 90e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project diep("recvfrom()"); 91e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("Received packet from %s:%d\nData: %s\n\n", 92e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port), buf); 93e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 94e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 95e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("UDP server closing\n"); 96e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project close(s); 97e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 98e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else /* !runServer */ 99e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project { 100e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1) 101e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project diep("socket"); 102e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 103e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project memset((char *) &si_other, 0, sizeof(si_other)); 104e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project si_other.sin_family = AF_INET; 105e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project si_other.sin_port = htons(udpPort); 106e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project si_other.sin_addr.s_addr = address; 107e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 108e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("UDP client sending packets to %s:%d\n", inet_ntoa(si_other.sin_addr), udpPort); 109e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 110e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (i=0; i<NPACK; i++) { 111e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("Sending packet %d\n", i); 112e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project sprintf(buf, "This is packet %d\n", i); 113e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (sendto(s, buf, BUFLEN, 0, (struct sockaddr*)&si_other, slen)==-1) 114e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project diep("sendto()"); 115e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 116e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 117e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project close(s); 118e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("UDP client closing\n"); 119e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 120e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 121e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 122