740542d1dd64343901389ba0d6490d791d6b39ec
[tests.git] / qaapi / qa / tests / node / support / t9.cc
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <string.h>
5 #include <sys/types.h>
6 #include <sys/socket.h>
7 #include <arpa/inet.h>
8 #include <poll.h>
9
10
11 #define NORMAL_PORT 1234
12 #define RAW_PORT    0
13
14
15 int main(int argc, char** argv)
16 {
17    sockaddr_in rawLocal;
18    memset((void*)&rawLocal, 0, sizeof(rawLocal));
19    rawLocal.sin_family = AF_INET;
20    rawLocal.sin_port   = htons(RAW_PORT);
21
22    int rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_UDP);
23    if(rawSocket < 0) {
24       perror("socket() for RAW socket. Root permission missing?");
25       exit(1);
26    }
27
28    if(bind(rawSocket, (sockaddr*)&rawLocal, sizeof(rawLocal)) < 0) {
29       perror("bind()");
30       exit(1);
31    }
32
33
34    sockaddr_in normalLocal;
35    memset((void*)&normalLocal, 0, sizeof(normalLocal));
36    normalLocal.sin_family = AF_INET;
37    normalLocal.sin_port   = htons(NORMAL_PORT);
38
39    int normalSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
40    if(normalSocket < 0) {
41       perror("socket()");
42       exit(1);
43    }
44
45    if(bind(normalSocket, (sockaddr*)&normalLocal, sizeof(normalLocal)) < 0) {
46       perror("bind()");
47       exit(1);
48    }
49
50
51    for(;;) {
52       pollfd pfds[2];
53       pfds[0].fd     = normalSocket;
54       pfds[0].events = POLLIN;
55       pfds[1].fd     = rawSocket;
56       pfds[1].events = POLLIN;
57
58       int result = poll((pollfd*)&pfds, 2, -1);
59       if(result < 0) {
60          perror("poll()");
61          exit(1);
62       }
63       else if(result > 0) {
64          char buffer[65536 + 1];
65          if(pfds[0].revents & POLLIN) {
66             int bytes = recv(normalSocket, (char*)&buffer, sizeof(buffer) - 1, 0);
67             if(bytes >= 0) {
68                buffer[bytes] = 0x00;
69                printf("Received %d bytes on NORMAL socket: %s\n", bytes, buffer);
70             }
71             else {
72                perror("recv()");
73                exit(1);
74             }
75          }
76          if(pfds[1].revents & POLLIN) {
77             int bytes = recv(rawSocket, (char*)&buffer, sizeof(buffer) - 1, 0);
78             if(bytes >= 0) {
79                printf("Received %d bytes on RAW socket\n", bytes);
80             }
81             else {
82                perror("recv()");
83                exit(1);
84             }
85          }
86       }
87    }
88 }