Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2015
292
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.60 KB | None | 0 0
  1. #include "server.h"
  2.  
  3. static struct netconn *session[100];
  4. static int free_session[100];
  5. static int session_index;
  6.  
  7. int find_free_session(void);
  8.  
  9. void client (void *args){
  10.  
  11.     struct netbuf * netBuf = netbuf_new ();
  12.     int cl, rc;
  13.     char buf[100];
  14.     char message[] = "Message received\n";
  15.  
  16.     cl = *(int*)args;
  17.     free_session[cl] = 1;
  18.  
  19.     printf("Connected: %i\n", cl);
  20.  
  21.     while(1){
  22.         rc = netconn_recv(session[cl], &netBuf);
  23.         if(rc != ERR_OK){
  24.             fprintf(stderr, "Disconnected: %i\n", cl);
  25.             free_session[cl] = 0;
  26.             netconn_disconnect(session[cl]);
  27.             netconn_delete(session[cl]);
  28.             break;
  29.         }
  30.  
  31.         netbuf_copy(netBuf, (void **)&buf, 100);
  32.         printf("Received from %i : %s", cl, buf);
  33.  
  34.         netconn_write(session[cl], message, strlen(message), NETCONN_COPY);
  35.         netbuf_delete(netBuf);
  36.     }
  37.  
  38. }
  39.  
  40. int find_free_session(void){
  41.     int i;
  42.     for(i=0; i<100; i++)
  43.         if(free_session[i] == 0)
  44.             return i;
  45.  
  46.     return -1;
  47. }
  48.  
  49. void server(void *args){
  50.  
  51.     int rc;
  52.     struct ip_addr listenaddr = { 0 };
  53.     struct netconn *listener;
  54.  
  55.     args = args;
  56.     listener = netconn_new(NETCONN_TCP);
  57.  
  58.     rc = netconn_bind(listener, &listenaddr, PORT);
  59.     VDIE(rc != ERR_OK, "netconn_bind");
  60.  
  61.     rc = netconn_listen(listener);
  62.     VDIE(rc != ERR_OK, "netconn_listen");
  63.  
  64.     while(1){
  65.         /* Wait for the internal semaphore so we know when a new connection arived */
  66.         sys_arch_sem_wait(&listener->acceptmbox->not_empty, 0);
  67.         session_index = find_free_session();
  68.         if(session_index == -1)
  69.             continue;
  70.  
  71.         netconn_accept(listener, &session[session_index]);
  72.         create_thread("client", client, (void *)&session_index);
  73.     }
  74.  
  75.     return;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement