Ceci est une ancienne révision du document !
Table des matières
Petit serveur avec LibWebSockets
Un tutoriel permettant de débuter avec la librairie LibWebSocket a été rédigé en anglais à cette page.
Matériel : Raspberry 3 modèle B+ Carte SD 16 Go
Installation de LibWebSockets
Installer la version Raspbian Stretch Lite 2019-04-08
En configuration supplémentaire, changer le nom en ServeurWebsocket
sudo raspi-config
Aller dans - 2 Network Options - puis - N1 Hostname - puis changer le nom en : serveurwebsocket Valider, puis aller dans - 4 Localisation Options - puis dans - I2 Change Timezone - et choisissez votre région puis la ville de référence et valider
Aller sur Finish puis yes pour redémarrer.
sudo apt-get install cmake sudo apt-get install git-core sudo apt-get install libssl-dev git clone https://github.com/warmcat/libwebsockets cd libwebsockets mkdir build cd build cmake .. -DLWS_IPV6=OFF make sudo make install cd
Pour verifier que tout fonctionne bien
libwebsockets-test-server
Taper dans votre navigateur préféré :
http://serveurwebsocket:7681/
Si le compteur démarre, alors la librairie est bien installée.
Serveur Minitel
sudo nano serveurWebsocket.c
Copier le code ci-dessous :
// gcc -Wall serveurWebsocket.c -o serveurWebsocket -lwebsockets #include <stdio.h> #include <stdlib.h> #include <libwebsockets.h> static int lws_callback_http( struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len ) { switch (reason) { case LWS_CALLBACK_ESTABLISHED: printf("connection established\n"); break; case LWS_CALLBACK_RECEIVE: { unsigned char *buf = (unsigned char*) malloc(LWS_SEND_BUFFER_PRE_PADDING + len + LWS_SEND_BUFFER_POST_PADDING); int i; for (i=0; i < len; i++) { buf[LWS_SEND_BUFFER_PRE_PADDING + (len - 1) - i ] = ((char *) in)[i]; } printf("received data: %s, replying: %.*s\n", (char *) in, (int) len, buf + LWS_SEND_BUFFER_PRE_PADDING); lws_write(wsi, &buf[LWS_SEND_BUFFER_PRE_PADDING], len, LWS_WRITE_TEXT); free(buf); break; } default: break; } return 0; } static struct lws_protocols protocols[] = { { "http-only", // name lws_callback_http, // callback 0 // per_session_data_size }, { NULL, NULL, 0 /* End of list */ } }; static const struct lws_extension exts[] = { { "permessage-deflate", lws_extension_callback_pm_deflate, "permessage-deflate" }, { NULL, NULL, NULL /* terminator */ } }; int main(void) { int port = 9000; const char *interface = NULL; struct lws_context *context; int opts = 0; // create libwebsocket context representing this server struct lws_context_creation_info info; memset(&info, 0, sizeof info); info.port = port; info.iface = interface; info.protocols = protocols; info.extensions = exts; //if (!use_ssl) { info.ssl_cert_filepath = NULL; info.ssl_private_key_filepath = NULL; //} else { // info.ssl_cert_filepath = LOCAL_RESOURCE_PATH"/libwebsockets-test-server.pem"; // info.ssl_private_key_filepath = LOCAL_RESOURCE_PATH"/libwebsockets-test-server.key.pem"; //} info.gid = -1; info.uid = -1; info.options = opts; context = lws_create_context(&info); if (context == NULL) { fprintf(stderr, "libwebsocket init failed\n"); return -1; } printf("starting server...\n"); while (1) { lws_service(context, 50); } lws_context_destroy(context); return 0; }
Ctrl + o pour enregistrer et Ctrl + x pour sortir de nano
Compiler le tout :
gcc -Wall serveurWebsocket.c -o serveurWebsocket -lwebsockets
sudo ldconfig ./serveurWebsocket