Blame view

serveur/serveur.c 2.34 KB
d2bf4d00   Justine Senellart   partie applicatio...
1
2
3
4
5
6
7
8
9
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <libwebsockets.h>
  
  #define MAX_FRAME_SIZE  1024
  #define WAIT_DELAY      50
  
  static int callback_http(
9d49ca3a   jsenella   essais
10
11
12
  			 struct libwebsocket_context *this,
  			 struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,
  			 void *user,void *in,size_t len)
d2bf4d00   Justine Senellart   partie applicatio...
13
  {
9d49ca3a   jsenella   essais
14
    return 0;
d2bf4d00   Justine Senellart   partie applicatio...
15
16
17
  }
  
  static int callback_my(
9d49ca3a   jsenella   essais
18
19
20
  		       struct libwebsocket_context * this,
  		       struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,
  		       void *user,void *in,size_t len)
d2bf4d00   Justine Senellart   partie applicatio...
21
  {
9d49ca3a   jsenella   essais
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
    static char *message=NULL;
    static int msize=0;
    switch(reason){
    case LWS_CALLBACK_ESTABLISHED:
      printf("connection established\n");
      message=NULL;
      // Declenchement d'un prochain envoi au navigateur
      libwebsocket_callback_on_writable(this,wsi);
      break;
    case LWS_CALLBACK_RECEIVE:
      // Ici sont traites les messages envoyes par le navigateur
      printf("received data: %s\n",(char *)in);
      message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);
      if(message==NULL){ perror("callback_my.malloc"); exit(EXIT_FAILURE); }
      memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len);
      // Declenchement d'un prochain envoi au navigateur
      msize=len;
      libwebsocket_callback_on_writable(this,wsi);
      break;
    case LWS_CALLBACK_SERVER_WRITEABLE:
      // Ici sont envoyes les messages au navigateur
      if(message!=NULL){
        char *out=message+LWS_SEND_BUFFER_PRE_PADDING;
        libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT);
        free(message);
        message=NULL;
      }
      break;
    default:
      break;
    }
    return 0;
d2bf4d00   Justine Senellart   partie applicatio...
54
55
56
  }
  
  static struct libwebsocket_protocols protocols[] = {
9d49ca3a   jsenella   essais
57
58
59
60
61
62
63
64
    {
      "http-only",   // name
      callback_http, // callback
      0,             // data size
      0              // maximum frame size
    },
    {"myprotocol",callback_my,0,MAX_FRAME_SIZE},
    {NULL,NULL,0,0}
d2bf4d00   Justine Senellart   partie applicatio...
65
66
67
  };
  
  int main(void) {
9d49ca3a   jsenella   essais
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
    //port du serveur
    int port=9000;
    struct lws_context_creation_info info;
    memset(&info,0,sizeof info);
    info.port=port;
    info.protocols=protocols;
    info.gid=-1;
    info.uid=-1;
    struct libwebsocket_context *context=libwebsocket_create_context(&info);
    if(context==NULL){
      fprintf(stderr, "libwebsocket init failed\n");
      return -1;
    }
    printf("starting server...\n");
    while(1){
      libwebsocket_service(context,WAIT_DELAY);
    }
    libwebsocket_context_destroy(context);
    return 0;
  }