source: abuse/tags/pd/abuse/src/net/mac/socktst.c

Last change on this file was 49, checked in by Sam Hocevar, 11 years ago
  • Imported original public domain release, for future reference.
  • Property svn:keywords set to Id
File size: 7.0 KB
Line 
1#include <stdlib.h>
2#include <stdio.h>
3#include <string.h>
4#include "sock.hpp"
5#include "tcpip.hpp"
6
7#ifdef __POWERPC__
8tcpip_protocol tcpip;
9#endif
10
11char delim[]=" \n";
12char spinchar[] = "\\|/-";
13
14net_protocol *prot = net_protocol::first;
15net_socket::socket_type socktype;
16net_address *addr;
17int port = 0x9091;
18int notify_port = 0x9099;
19
20void spin()
21//{{{
22{
23  static int pos = 0;
24 
25  printf("\r%c",spinchar[pos]);
26  pos = (pos+1)&3;
27}
28//}}}
29
30#define MAX_CLIENTS 2
31
32void udp_server()
33//{{{
34{
35  net_socket *srv;
36  int cont;
37
38  // Create listen socket to accept client connections
39  printf("Starting server listen socket on port %d.\n",port);
40  srv = prot->create_listen_socket(port, socktype);
41  srv->read_selectable();
42  prot->start_notify(notify_port,"Test server",11);
43  printf("Waiting for connections\n");
44
45  cont = 1;
46  while (cont) {
47    spin();
48    // wait for next network event
49    if (prot->select(0)) {
50      if (srv->ready_to_read()) {
51        // server socket has data
52                                char buf[513];
53                                int len;
54        net_address *addr;
55        char name[80];
56
57                                len = srv->read(buf,512,&addr);
58                                if (addr)
59                                        addr->store_string(name,80);
60                                else
61                                        name[0] = 0;
62
63                                if (len>0) {
64                                        buf[len] = 0;
65                                        printf("Server: Got [%s] from [%s]\n",buf,name);
66                                }
67
68                                if (addr && len>0) {
69                                        if (strcmp(buf,"die")==0)
70                                                cont = 0;
71
72                                        srv->write(buf,len,addr);
73                                        printf("Server: Echoing [%s] to [%s]\n",buf,name);
74                                }
75      }
76    }
77  }
78  delete srv;
79}
80//}}}
81
82void tcp_server()
83//{{{
84{
85  net_socket *srv;
86  net_socket *clt[MAX_CLIENTS] = {0,0};
87  int state[MAX_CLIENTS] = {0,0};
88  char buf[MAX_CLIENTS][256];
89  int len[MAX_CLIENTS];
90  int cont;
91
92  // Create listen socket to accept client connections
93  printf("Starting server listen socket.\n");
94  srv = prot->create_listen_socket(port, socktype);
95  srv->read_selectable();
96  prot->start_notify(notify_port,"Test server",11);
97  printf("Waiting for connections\n");
98
99  cont = 1;
100  while (cont) {
101    spin();
102    // wait for next network event
103    if (prot->select(0)) {
104      //{{{ Check server socket
105      if (srv->ready_to_read()) {
106        // server socket has data, i.e. connection requested
107        int i;
108        net_address *addr;
109        net_socket *new_clt;
110        char name[80];
111     
112        new_clt = srv->accept(addr);
113        addr->store_string(name,80);
114        printf("Got connect from [%s]...",name);
115     
116        // search for available client storage
117        for (i=0; i<MAX_CLIENTS; i++)
118          if (clt[i] == 0)
119            break;
120     
121        if (i<MAX_CLIENTS) {
122          // save socket to client
123          clt[i] = new_clt;
124     
125          // make reads "selectable" to alert of read events
126          new_clt->read_selectable();
127          printf("accepted\n");
128        }
129        else
130          printf("rejected!\n");
131      }
132      //}}}
133      //{{{ Check client statuses
134      for (int i=0; i<MAX_CLIENTS; i++)
135      if (clt[i]) {
136        if (clt[i]->error()) {
137          printf("Aiieeee!  Error on %d.\n",i);
138          delete clt[i];
139          clt[i] = 0;
140        }
141        if (clt[i]->ready_to_read()) {
142          // Client sent us data
143          if (state[i] == 0) {
144            len[i] = clt[i]->read(buf[i], 256);
145            if (len[i] <= 0) {
146              // 0 length read means EOF
147              printf("Closing connection %i\n",i);
148              delete clt[i];
149              clt[i] = 0;
150              break;
151            }
152            else {
153              // normal read
154              clt[i]->write_selectable();
155              clt[i]->read_unselectable();
156              state[i] = 1;
157              buf[i][len[i]] = 0;
158              printf("Server: From %d Got [%s] len %d\n",i,buf[i],len[i]);
159              if (!strcmp(buf[i],"die"))
160                cont = 0;
161            }
162          }
163        }
164        if (clt[i]->ready_to_write()) {
165          if (state[i] == 1) {
166            // Echo data back to client
167            clt[i]->write(buf[i], len[i]);
168            clt[i]->read_selectable();
169            clt[i]->write_unselectable();
170            state[i] = 0;
171            printf("Server: Echoed to %d: [%s] len %d\n",i,buf[i],len[i]);
172          }
173        }
174      }
175      //}}}
176    }
177  }
178  for (int i=0; i<MAX_CLIENTS; i++)
179    if (clt[i])
180      delete clt[i];
181  delete srv;
182}
183//}}}
184
185void client()
186//{{{
187{
188  net_socket *clt;
189  char s[256];
190  int len, cont;
191
192  // finding server
193        printf("Trying to find server\n");
194        net_address *addr;
195  while (!(addr = prot->find_address(notify_port,s)))
196                spin();
197
198  // Create new socket to server
199        addr->set_port(port);
200        addr->store_string(s,256);
201  printf("Trying to connect to server [%s].\n",s);
202        clt = prot->connect_to_server(addr,socktype);
203  //  ((unix_fd*)clt)->broadcastable();
204 
205  while (1) {
206    printf("Enter client data.\n");
207    gets(s);
208
209    // Quit on Q
210    if (!strcmp(s,"q"))
211      break;
212
213    clt->read_unselectable();
214    clt->write_selectable();
215    while (!clt->ready_to_write() && !clt->error()) {
216      spin();
217      prot->select(0);
218    }
219
220    if (clt->error())
221      break;
222
223    len = clt->write(s,strlen(s));
224   
225    printf("Wrote [%s] length %d\n",s,len);
226   
227    clt->read_selectable();
228    clt->write_unselectable();
229    while (!clt->ready_to_read() && !clt->error()) {
230      spin();
231      prot->select(0);
232    }
233   
234    if (clt->error())
235      break;
236   
237    len = clt->read(s,256);
238
239    if (len <= 0) {
240      printf("Server died\n");
241      break;
242    }
243   
244    printf("Got [%s] len %d\n",s,len);
245  }
246  delete clt;
247}
248//}}}
249
250main()
251//{{{
252{
253  char str[256], *s;
254
255  if (prot->installed()) {
256    printf("Testing %s...\n",prot->name());
257  }
258  else {
259    printf("No protocol!\n");
260    exit(1);
261  }
262
263  while (1) {
264    printf("\n> ");
265    gets(str);
266    s = strtok(str,delim);
267    if (!s)
268      break;
269
270    switch (s[1]) {
271    case 'u':
272    case 'U':
273      socktype = net_socket::SOCKET_FAST;
274      break;
275    case 's':
276    case 'S':
277      socktype = net_socket::SOCKET_SECURE;
278      break;
279    }
280
281    switch (s[0]) {
282    case 'c':
283    case 'C':
284      s = strtok(0,delim);
285#if 0
286      addr = prot->get_node_address(s,port,0);
287#else
288      sockaddr_in host;
289      char tmp[4];
290     
291      for (int i=0; i<4; i++)
292      {
293        int num = 0;
294        while (*s)
295        {
296          if (*s=='.')
297          {
298            s++;
299            break;
300          }
301          num = num*10 + *s - '0';
302          s++;
303        }
304        tmp[i] = num;
305      }
306     
307      memset( (char*) &host,0, sizeof(host));
308      host.sin_family = AF_INET;
309      host.sin_port = htons(port);
310      host.sin_addr.s_addr = htonl(INADDR_ANY);
311      memcpy(&host.sin_addr,tmp,sizeof(in_addr));
312     
313      addr = new ip_address(&host);
314#endif
315      client();
316      break;
317    case 's':
318    case 'S':
319                        if (socktype == net_socket::SOCKET_FAST)
320                                udp_server();
321                        else
322                                tcp_server();
323      break;
324    case 'q':
325    case 'Q':
326      exit(1);
327      break;
328    }
329  }
330}
331//}}}
332
333//{{{ Revision Log
334/*//////////////////////////////////////////////////////////////////////
335$Log$
336//////////////////////////////////////////////////////////////////////*/
337//}}}
338
339//{{{ Emacs Locals
340// Local Variables:
341// folded-file: t
342// End:
343//}}}
Note: See TracBrowser for help on using the repository browser.