Adding select support for basic socket udp receive.
[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         fd_set readset;
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         int result;
83         for (j=0; j<10; j++){
84                 strcpy(recv_buf, "DEADBEEFDEADBEE");
85                 // select before a blocking receive
86                 do {
87                         FD_ZERO(&readset);
88                         FD_SET(sockfd, &readset);
89                         result = select(sockfd + 1, &readset, NULL, NULL, NULL);
90                         printf("select result %d \n", result);
91                         printf("readset %d \n", FD_ISSET(sockfd, &readset));
92                 } while (result == -1 && errno == EINTR);
93                 // configure recvfrom not to block when there is 
94
95                 if (((n = recvfrom(sockfd, recv_buf, 5, 0, (struct sockaddr*) &server, &socklen))< 0)){ // should discard if it is udp..
96                         printf("recv failed\n");
97                 }
98                 recv_buf[n-1] = 0; //null terminate
99                 printf("[OUTPUT] recv %d with length %d from result %s\n", j,n,  recv_buf);
100         }
101         while(1){;}
102         close(sockfd);
103 }