1 | //Main SERVER
|
2 | #include <sys/types.h>
|
3 | #include <sys/socket.h>
|
4 | #include <netinet/in.h>
|
5 | #include <arpa/inet.h>
|
6 | #include <stdio.h>
|
7 | #include <unistd.h>
|
8 | #include <errno.h>
|
9 | #include <string.h>
|
10 | #include <stdlib.h>
|
11 | #include <sys/select.h>//use select() for multiplexing
|
12 | #include <sys/fcntl.h> // for non-blocking
|
13 |
|
14 | #define MAX_LENGTH 100000
|
15 | #define PORT 1901
|
16 |
|
17 | /* Select() params
|
18 | * int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
|
19 | * FD_SET(int fd, fd_set *set);
|
20 | * FD_CLR(int fd, fd_set *set);
|
21 | * FD_ISSET(int fd, fd_set *set);
|
22 | * FD_ZERO(fd_set *set);
|
23 | */
|
24 |
|
25 | void error(char *message)
|
26 | {
|
27 | perror(message);
|
28 | exit(1);
|
29 | }
|
30 |
|
31 | int main()
|
32 | {
|
33 |
|
34 | // select parameters declared
|
35 | fd_set original_socket;
|
36 | fd_set original_stdin;
|
37 | fd_set readfds;
|
38 | fd_set writefds;
|
39 | struct timeval tv;
|
40 | int numfd, numfd2;
|
41 |
|
42 | // socket parameters declared
|
43 | int socket_fd_ob, socket_fd_hm;
|
44 | int bytes_read, bytes_sent;
|
45 | char address_length, address_length2;
|
46 | char recieve_data[MAX_LENGTH];
|
47 | char send_data[MAX_LENGTH];
|
48 | struct sockaddr_in server_address_ob, server_address_hm, client_address;
|
49 | int z = 0;
|
50 |
|
51 | //Socket creation done separately for both OB and HM communications
|
52 | if ((socket_fd_ob = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
|
53 | {
|
54 | error("socket()");
|
55 | }
|
56 | if ((socket_fd_hm = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
|
57 | {
|
58 | error("socket()");
|
59 | }
|
60 |
|
61 |
|
62 | fcntl(socket_fd_ob, F_SETFL, O_NONBLOCK); //set socket to non-blocking
|
63 | fcntl(socket_fd_hm, F_SETFL, O_NONBLOCK); //set socket to non-blocking
|
64 |
|
65 | // clear the set ahead of time
|
66 | FD_ZERO(&original_socket);
|
67 | FD_ZERO(&original_stdin);
|
68 | FD_ZERO(&readfds);
|
69 | FD_ZERO(&writefds);
|
70 |
|
71 | // add our descriptors to the set (0 - stands for STDIN)
|
72 | FD_SET(socket_fd_ob, &original_socket);//instead of 0 put socket_fd_ob
|
73 | FD_SET(socket_fd_ob, &readfds);
|
74 | FD_SET(0,&original_stdin);
|
75 | FD_SET(0, &writefds);
|
76 |
|
77 | // since we got s2 second, it's the "greater", so we use that for
|
78 | // the n param in select()
|
79 | numfd = socket_fd_ob + 1;
|
80 | numfd2 = socket_fd_hm + 1;
|
81 |
|
82 |
|
83 | // wait until either socket has data ready to be recv()d (timeout 10.5 secs)
|
84 | tv.tv_sec = 1;
|
85 | tv.tv_usec = 500000;
|
86 |
|
87 | server_address_ob.sin_family = AF_INET;
|
88 | server_address_ob.sin_port = htons(1901);
|
89 | server_address_ob.sin_addr.s_addr = inet_addr("127.0.0.3");
|
90 | bzero(&(server_address_ob.sin_zero),sizeof(server_address_ob));
|
91 |
|
92 | server_address_hm.sin_family = AF_INET;
|
93 | server_address_hm.sin_port = htons(1901);
|
94 | server_address_hm.sin_addr.s_addr = inet_addr("127.0.0.1");
|
95 | bzero(&(server_address_ob.sin_zero),sizeof(server_address_hm));
|
96 |
|
97 | // Bind socket to the particular addresses
|
98 |
|
99 | if (bind(socket_fd_ob,(struct sockaddr *)&server_address_ob, sizeof(struct sockaddr)) == -1)
|
100 | {
|
101 | error("bind()");
|
102 | }
|
103 |
|
104 | if (bind(socket_fd_hm,(struct sockaddr *)&server_address_hm, sizeof(struct sockaddr)) == -1)
|
105 | {
|
106 | error("bind()");
|
107 | }
|
108 |
|
109 | address_length = sizeof(struct sockaddr);
|
110 | address_length2 = sizeof(struct sockaddr);
|
111 |
|
112 | printf("\nMain server waiting for client to respond...\n");
|
113 | fflush(stdout);
|
114 |
|
115 | while (1)
|
116 | {
|
117 | readfds = original_socket;
|
118 | writefds = original_stdin;//problem
|
119 | int recieve = select(numfd, &readfds, &writefds,/*NULL,*/ NULL, &tv);
|
120 | int sent = select(numfd2, &readfds, &writefds,/*NULL,*/ NULL, &tv);
|
121 |
|
122 | if (recieve == -1 || sent == -1)
|
123 | {
|
124 | perror("select"); // error occurred in select()
|
125 | }
|
126 | else if (recieve == 0 || sent == 0)
|
127 | {
|
128 | printf("Timeout occurred! No data after 1.5 seconds.\n");
|
129 | }
|
130 | else
|
131 | {
|
132 | // one or both of the descriptors have data
|
133 | if (FD_ISSET(socket_fd_ob, &readfds)) //if set to read
|
134 | {
|
135 | FD_CLR(socket_fd_ob, &readfds);
|
136 | bytes_read = recvfrom(socket_fd_ob,recieve_data,MAX_LENGTH,0,(struct sockaddr *)&server_address_hm, &address_length);
|
137 |
|
138 | for (z = 0; z < bytes_read; ++z) {
|
139 | FD_ISSET(socket_fd_hm, &writefds);
|
140 | FD_CLR(socket_fd_hm, &writefds);
|
141 | //recvfrom speech recognition client and decide what to send to HM accordingly..
|
142 | send_data[bytes_read] = recieve_data[bytes_read];
|
143 | //block call, will wait till client enters something, before proceeding
|
144 | //send the corresponding to HM
|
145 | bytes_sent = sendto(socket_fd_hm,send_data,strlen(send_data)+1,0,(struct sockaddr *)&server_address_hm, &address_length2);
|
146 | fflush(stdout);
|
147 | }
|
148 | recieve_data[bytes_read] = '\0'; //add null to the end of the buffer
|
149 | send_data[bytes_read] = '\0'; //add null to the end of the buffer
|
150 |
|
151 | printf("\n(%s , %d) rcvd: %02x\n",inet_ntoa(server_address_hm.sin_addr),ntohs(server_address_hm.sin_port),recieve_data);
|
152 | printf("\n(%s , %d) sent: %02x\n",inet_ntoa(server_address_hm.sin_addr),ntohs(server_address_hm.sin_port),send_data);
|
153 | }
|
154 |
|
155 |
|
156 |
|
157 |
|
158 | } //end else
|
159 | }//end while
|
160 |
|
161 | close (socket_fd_ob);
|
162 | return 0;
|
163 | }
|