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

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