88665a248a4dfeb99bcaa7fcdc5334c457e0c792
[akaros.git] / tests / udp_test.c
1 #include <sys/types.h>
2 #include <sys/socket.h>
3 #include <netinet/in.h>
4 #include <arpa/inet.h>
5 #include <netdb.h>
6 #include <stdio.h>
7 #include <unistd.h>
8 #include <errno.h>
9 #include <string.h>
10 #include <stdlib.h>
11 #define BUF_SIZE 16
12 #define LARGE_BUFFER_SIZE 2048
13
14 /* Test program
15  *
16  * Pings the server at argv1: argv2
17  * gets a response and prints it
18  */
19
20 int main(int argc, char* argv[]) {
21         struct sockaddr_in server;
22         char buf[BUF_SIZE] = "hello world";
23         char bulkdata[LARGE_BUFFER_SIZE] = "testme";
24         char recv_buf[BUF_SIZE];
25         int sockfd, n, inqemu;
26         struct hostent* host;
27
28         // ignore the host for now
29         if (argc == 2){
30                 printf("in qemu client\n");
31                 inqemu = 1;
32         }
33         else if (argc == 3){
34                 printf("linux client\n");
35                 inqemu = 0;
36         } else 
37         {
38                 printf("incorrect number of parameters\n");
39         }
40         if (!inqemu){
41                 host = gethostbyname(argv[1]); //hostname
42         }
43         bzero(&server, sizeof(server));
44         server.sin_family = AF_INET;
45         if (inqemu)
46                 server.sin_port = htons(atoi(argv[1]));
47         else
48                 server.sin_port = htons(atoi(argv[2]));
49
50
51         if (inqemu)
52                 server.sin_addr.s_addr = inet_addr("10.0.0.1"); //hardcoded server 
53         else
54                 memcpy(&server.sin_addr.s_addr, host->h_addr, host->h_length);
55         
56         char* printbuf = (char*)&server.sin_addr.s_addr;
57         int size = sizeof(server.sin_addr.s_addr);      
58         int i;
59         for (i=0; i<size;i++) {
60                 printf("%x", ((char*)printbuf)[i]); 
61         }
62
63         //server.sin_addr = *((struct in_addr *)host->h_addr);
64         sockfd = socket(AF_INET, SOCK_DGRAM, 0);        
65         if (sockfd==-1) {
66                 printf("socket error\n");
67                 return -1;
68         }
69
70         printf ("udp_test: sockfd %d \n", sockfd);
71         int socklen = sizeof(server);
72         // sending large chunk of data of 2K, more than one frame
73         // int sendsize =  sendto(sockfd, bulkdata, LARGE_BUFFER_SIZE, 0, (struct sockaddr*) &server, socklen);
74
75         // sending a large chunk of data but fitting in one packet
76          //int sendsize =  sendto(sockfd, bulkdata, 500, 0, (struct sockaddr*) &server, socklen);
77
78         int sendsize = sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr*) &server, socklen);
79         printf("sendto returns %d, errno %d\n", sendsize, errno);
80         //assume BUF_SIZE is larger than the packet.. so we will get to see what actually comes back..
81         int j=0;
82         for (j=0; j<10; j++){
83                 strcpy(recv_buf, "DEADBEEFDEADBEE");
84                 // if (((n = recvfrom(sockfd, recv_buf, BUF_SIZE, 0, (struct sockaddr*) &server, &socklen))< 0)){
85                 if (((n = recvfrom(sockfd, recv_buf, 5, 0, (struct sockaddr*) &server, &socklen))< 0)){ // should discard if it is udp..
86                         printf("recv failed\n");
87                 }
88                 recv_buf[n-1] = 0; //null terminate
89                 printf("[OUTPUT] recv %d with length %d from result %s\n", j,n,  recv_buf);
90         }
91         while(1){;}
92         close(sockfd);
93 }