Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1612 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  programmation d'un serveur par socket en C++

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

programmation d'un serveur par socket en C++

n°2166031
dadex85
merci a tous
Posté le 29-11-2012 à 13:49:47  profilanswer
 

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
mood
Publicité
Posté le 29-11-2012 à 13:49:47  profilanswer
 

n°2166069
Joel F
Real men use unique_ptr
Posté le 29-11-2012 à 18:59:33  profilanswer
 

oui, utilise boost.ASIO

n°2166084
tpierron
Posté le 29-11-2012 à 21:17:10  profilanswer
 


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.

n°2166125
dadex85
merci a tous
Posté le 30-11-2012 à 10:38:33  profilanswer
 

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


---------------
david
n°2166136
dadex85
merci a tous
Posté le 30-11-2012 à 12:47:15  profilanswer
 

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
n°2166175
breizhbugs
Posté le 30-11-2012 à 15:42:57  profilanswer
 

Transmetteur?


---------------
Seul Google le sait...
n°2166178
dadex85
merci a tous
Posté le 30-11-2012 à 15:56:21  profilanswer
 

un transmetteur vocalys DX

n°2166234
breizhbugs
Posté le 30-11-2012 à 23:42:18  profilanswer
 

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...

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  programmation d'un serveur par socket en C++

 

Sujets relatifs
Python - Programmation - Soucis[RESOLU] socket inter-process C/PHP linux
Programmation android[C][reseau] connection tcp (3 voies) raw socket
Programmation caméra ip sur internet[Programmation sockets] fermeture du socket à la fin du script
Programmation socket Cprogrammation socket. fonction accept() retourne 0
programmation socket sous windows[C] Programmation socket
Plus de sujets relatifs à : programmation d'un serveur par socket en C++


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR