programmation d'un serveur par socket en C++

programmation d'un serveur par socket en C++ - C++ - Programmation

Marsh Posté le 29-11-2012 à 13:49:47    

bonjour a tous
 
je souhaite transmettre les data d'un transmetteur à mon server . Mais j'ai un soucis j'arrive a connecté le transmetteur au serveur mais les data n'arrive pas
 
 
voici ce que j'ai eu jusque la:

Code :
  1. #include "stdafx.h"
  2. #pragma comment(lib,"ws2_32.lib" )
  3. /**==================[ Si Windows ]================**/
  4. #if defined (WIN32) 
  5. #include <winsock2.h>
  6. /**================[ Si Gnu/Linux ]================**/
  7. #elif defined (linux) 
  8. #include <sys/types.h>
  9. #include <sys/socket.h>
  10. #include <netinet/in.h>
  11. #include <arpa/inet.h>
  12. #include <unistd.h>
  13. #define INVALID_SOCKET -1
  14. #define SOCKET_ERROR -1
  15. #define closesocket(s) close (s)
  16. typedef int SOCKET;
  17. typedef struct sockaddr_in SOCKADDR_IN;
  18. typedef struct sockaddr SOCKADDR;
  19. /**===============[ Si Autre Systems ]==============**/
  20. #else
  21. #error not defined for this platform
  22. #endif /**========[ Fin teste portabilite' ]========**/
  23. /* Inclure les fichiers d'en-tete dont on a besoin */
  24. #include <stdio.h>
  25. #include <stdlib.h>
  26. #include <string.h>
  27. #define DEBUG 0 /** Aclive: 1,  Desactive: 0 **/
  28. #define SERVER_PORT_LISTENING 10002
  29. int App (void);
  30. int ConnectWithClient ( SOCKET*, SOCKET* );
  31. int CommunicatWithClient ( SOCKET );
  32. int RecvData ( SOCKET socket, char *data );
  33. /**************************************************************************
  34. * Fonction main():
  35. * La fonction principale ( le point d'entrer )...
  36. ***************************************************************************/
  37. int main (void)
  38. {
  39.    int flag_main_exit = EXIT_SUCCESS;
  40. /**==================[ Si Windows ]================**/
  41. #if defined (WIN32)
  42.    WSADATA wsa_data;
  43.    /* Si l'initialisation sous windows echoue */
  44.    if ( WSAStartup (MAKEWORD (2, 2), &wsa_data) )
  45.       return EXIT_FAILURE;
  46.    puts ("Windows: winsock2: OK" );
  47. #endif /**===========[ Fin teste Windows ]==========**/
  48.    /* si app() retourne 1 c'est qu'elle a echoue' */
  49.    if ( App () )
  50.       flag_main_exit = EXIT_FAILURE;
  51. /**==================[ Si Windows ]================**/
  52. #if defined (WIN32)
  53.    /* Fermer ce qu'on a initialiser avec WSAStartup */
  54.    WSACleanup ();
  55. #endif /**===========[ Fin teste Windows ]==========**/
  56.    puts("\nFermeture du serveur ..." );
  57.    getchar();
  58.    return flag_main_exit;
  59. }
  60. /**************************************************************************
  61. * Fonction App():
  62. ** Le Serveur se connecte avec le client: ConnectToServer()
  63. ** Si connexion etablie, passer a' la communication CommunicatWithClient()
  64. ***************************************************************************/
  65. int App (void)
  66. {
  67.    SOCKET sock, csock;
  68.    int sock_err;
  69.     if( ConnectWithClient (&csock, &sock) )
  70.       return 1; /* retourne 1 s'il y eu probleme */
  71.    if ( CommunicatWithClient(csock) )
  72.       return 1; /* retourne 1 s'il y eu probleme */
  73.    /* Fin de communication, fermer socket proprement */
  74.    shutdown (sock, 2);   shutdown (csock, 2);
  75.    sock_err = closesocket (sock), sock = INVALID_SOCKET;
  76.    if (sock_err == SOCKET_ERROR)
  77.    {
  78.       perror("Error: sock.closesocket()" );
  79.       return 1;
  80.    }
  81.    return 0;
  82. }
  83. /******************************************************************************
  84. * Fonction: ConnectWithClient()
  85. ** Connexion avec le client (avec sock), et recuperation d'infos
  86. **        sur le client, sur csock ...
  87. ******************************************************************************/
  88. int ConnectWithClient ( SOCKET *csock, SOCKET *sock )
  89. {
  90.    /* Declaration de 2 structures de type SOCKADDR_IN */
  91.    SOCKADDR_IN sin; /* pour le serveur */
  92.    SOCKADDR_IN csin; /* pour le client */
  93.    int sock_err, recsize;
  94.    FILE* fichier = fopen("log.txt", "a" );
  95.    /* ouverture du socket */
  96.    if ( (*sock = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
  97.    {
  98.       perror("socket.open" );
  99.       return 1; /* Creation du socket a echouer */
  100.    }
  101.    printf ("socket %d est maintenant ouvert en mode TCP/IP\n", *sock);
  102.    sin.sin_addr.s_addr = htonl (INADDR_ANY); /* Pas besoin d'IP */
  103.    sin.sin_port = htons (SERVER_PORT_LISTENING);  /* port d'ecoute */
  104.    sin.sin_family = AF_INET;  /* famille du protocol (IP) */
  105.    /* bind du socket serveur (sock) avec la structure sin du serveur */
  106.    sock_err = bind (*sock, (SOCKADDR *) &sin, sizeof sin);
  107.    if (sock_err == SOCKET_ERROR)
  108.    {
  109.       perror("Error: bind" );
  110.       return 1;
  111.    }
  112.    /* ecoute sur le port */
  113.    if ( (sock_err = listen (*sock, 5)) == SOCKET_ERROR)
  114.    {
  115.       perror("Error: listen" );
  116.       return 1;
  117.    }
  118.    printf ("ecoute sur le port %d...\n", SERVER_PORT_LISTENING);
  119.    /* attendre et accepter la connection du client en recuperant les infos
  120.       sur le client dans csin, et en créant le socket du client csock */
  121.    recsize = (int) sizeof csin;
  122.    if( (*csock = accept(*sock, (SOCKADDR*) &csin, &recsize)) == INVALID_SOCKET)
  123.    {
  124.       perror("Error: accept" );
  125.       return 1;
  126.    }
  127.    printf ("transmetteur connecte avec socket: %d    de: %s   port: %d\n",
  128.                *csock,    inet_ntoa (csin.sin_addr)    ,htons (csin.sin_port));
  129.    if(fichier != NULL)
  130.    {
  131.       fputs("-----------------------------------\n", fichier);
  132.       fprintf(fichier, "transmetteur connecte avec socket: %d    de: %s   port: %d\n",
  133.                *csock,    inet_ntoa (csin.sin_addr)    ,htons (csin.sin_port));
  134.       fputs("-----------------------------------\n", fichier);
  135.       fclose(fichier);
  136.    }
  137.    return 0;
  138. }
  139. /******************************************************************************
  140. * Fonction: CommunicatWithClient()
  141. ** Permet d'echanger des donnees avec le Client.   Recevoir ou Envoyer
  142. ******************************************************************************/
  143. int CommunicatWithClient ( SOCKET csock )
  144. {
  145.    char data[1024 + 1];
  146.    int sock_err, err_close;
  147.    FILE* fichier = fopen("log.txt", "a" );
  148.    do
  149.    {
  150.       /* Attendre et recevoir des données envoyé par le client */
  151.       if ( (sock_err = RecvData (csock, data)) == SOCKET_ERROR )
  152.          break;
  153.       else
  154.       {
  155.          data[sock_err] = '\0';
  156.          printf("> %s\n", data);
  157.          if(fichier != NULL)
  158.             fprintf(fichier, "> %s\n", data);
  159.       }
  160.    }
  161.    while (1);
  162.    if(fichier != NULL)
  163.       fclose(fichier);
  164.    /* fermeture du socket client (csock), fin de la communication */
  165.    shutdown (csock, 2);
  166.    err_close = closesocket (csock), csock = INVALID_SOCKET;
  167.    if (err_close == SOCKET_ERROR)
  168.    {
  169.       perror("Error: csock.closesocket()" );
  170.       return 1;
  171.    }
  172.    return 0;
  173. }
  174. /******************************************************************************
  175. * Fonction: RecvData()
  176. ** Permet de recevoir proprement un Bloc de données
  177. ** Retourne la taille de data reçu
  178. ******************************************************************************/
  179. int RecvData ( SOCKET sock, char *data )
  180. {
  181.    size_t len_data;
  182.    size_t data_receved = 0;
  183.    char textmode_lendata[255], *pend;
  184.    int n;
  185.    /* Recevoir la taille de data */
  186.    n = recv(sock, textmode_lendata, sizeof textmode_lendata - 1, 0);
  187.    if (n <= 0)
  188.    {
  189.       if( n == 0 )
  190.          printf("Le transmetteur 'a Quitter...\n" );
  191.       return SOCKET_ERROR;
  192.    }
  193.    else
  194.    {
  195.       textmode_lendata[n] = '\0';
  196.       len_data = strtol (textmode_lendata, &pend, 10);
  197.       if (*pend != '\n')
  198.       {
  199.          printf("Pas de donnees recues !\n" );
  200.          return -1;
  201.       }
  202.    }
  203.    /* TantQu'on as pas recu tout, on continue ... */
  204.    while (data_receved < len_data)
  205.    {
  206.       n = recv (sock, data + data_receved, sizeof data - 1, 0);
  207.       if (n > 0)
  208.          data_receved += n;
  209.       else
  210.          return SOCKET_ERROR;
  211.    }
  212.    return ((int)data_receved);
  213. }


 
quelqu'un peut il m'aider.
cordialement


Message édité par dadex85 le 29-11-2012 à 14:10:09

---------------
david
Reply

Marsh Posté le 29-11-2012 à 13:49:47   

Reply

Marsh Posté le 29-11-2012 à 18:59:33    

oui, utilise boost.ASIO

Reply

Marsh Posté le 29-11-2012 à 21:17:10    


Ta fonction Recv() est mal foutue. Il faut rajouter ces lignes de codes après la ligne 254:

Code :
  1. data_receved = n - (pend - textmode_lendata);
  2. memcpy(data, pend, data_receved);


 
I.e: ton premier appel à recv va récupérer des morceaux du message (et dans le cas où ton message est < 255 octets, tu vas probablement récupérer l'intégralité). Partie dont il faut exclure dans la boucle qui suit, sinon ça va attendre indéfiniment.

Reply

Marsh Posté le 30-11-2012 à 10:38:33    

Bonjour à tous  
 
Merci pour vos réponses j'essaie et je vous faire un retour
 
Cordialement


---------------
david
Reply

Marsh Posté le 30-11-2012 à 12:47:15    

lorsque j'établie une connexion client serveur je reçois les données saisies par le client
mais lorsque j'établie une connexion transmetteur serveur je ne reçois aucun data

 

Cordialement


Message édité par dadex85 le 30-11-2012 à 12:47:40

---------------
david
Reply

Marsh Posté le 30-11-2012 à 15:42:57    

Transmetteur?


---------------
Seul Google le sait...
Reply

Marsh Posté le 30-11-2012 à 15:56:21    

un transmetteur vocalys DX

Reply

Marsh Posté le 30-11-2012 à 23:42:18    

le vocalys DX-> http://www.adetec.com/files/vocalys_dx.pdf
ou le vocalys DX-IP? http://www.eurodis-securite.com/doc/Vocalys%20IP.pdf
 
edit dans ce dernier cas, utilse un sniffeur de paquet pour voir si quelque chose arrive sur le PC...


Message édité par breizhbugs le 30-11-2012 à 23:46:05

---------------
Seul Google le sait...
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed