Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Un peu d'aide pour un serveur [ Archives / Au secours ] (NAVIE)

dimanche 27 février 2005 à 20:47:56 | Un peu d'aide pour un serveur

NAVIE

Bonjour, voilà mon souci: a l'aide de mon compilateur Dev-C++ Version 4.9.8.10 j'ai crée un socket qui sert de serveur. Cependant même si la compilation a été bonne, mon programme n'arrive pas à mettre en place le serveur. J'ai d'abord désactivé mon firewall mais cela a donné quand même le même résultat. Je me suis dit alors que peut-être cela vient de mon code; le voici:

#include <iostream>
#include <winsock2.h>
#include <conio.h>

using namespace std;

int main(int argc, char *argv[])
{

    WSADATA WSAData; 
    if((WSAStartup(0x0202, &WSAData))!=0)
    {
        cout<<"[-]WSAStartup Erreur:\n\a"<<WSAGetLastError()<<endl;
        getch();
        return -1;
    }
    cout<<"[+]WSAStartup réussi"<<endl;

    SOCKET W_IP;
    if((W_IP = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))==-1)
    {
        cout<<"[-]Erreur: Résolution de créer le socket.\n\a"<<endl;
        getch();
        return -1;
    }
    cout<<"[+]Création du socket réussie."<<endl;
    struct sockaddr_in server;
    struct sockaddr_in client;
    int sock_serv, sock_client;
   
    server.sin_family=AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons(6667);
   
    int sizeserv=sizeof(server);

    if ((bind(sock_serv,(struct sockaddr*)&server, sizeserv))==-1)
    {
        cout<<"[-]Impossible de lancer le serveur.\n\a"<<endl;
        getch();
        return -1;
    }
   
    char Buffer[]="Hello you!\r\n";   
    listen(sock_serv,0);

    while(1)
    {   
       
        int sizecli=sizeof(client);
        if ((sock_serv=accept(sock_serv,(struct sockaddr*)&client,&sizecli))==-1)
        {
            cout<<"[-]Erreur: Impossible d'accepter le visiteur.\n\a"<<endl;
        }
        send(sock_client, Buffer, strlen(Buffer), 0);
        cout<<"[+]Une personne vient de se connecter."<<endl;
    }   
    return 0;
}

Merci à quiqonque voudra m'aider.

NAVI

 

 


dimanche 27 février 2005 à 21:53:39 | Re : Un peu d'aide pour un serveur

NitRic

Premièrement, si ton WSAStartup() échoue, WSAGetLastError() n'est pas disponible:

   int ret;
   WSADATA wdata;

   /*
      WSAStartup() renvoie 0 si succès sinon, le code d'erreur
   */
   if ( (ret = WSAStartup( WINSOCK_VERSION, &wdata )) )
   {
      cout << "error => " << ret << endl;
      return 0;
   }

   /* notre version n'est pas disponible, pour éviter tout problème, on quitte */
   if ( LOBYTE(WINSOCK_VERSION) != LOBYTE(wdata.wVersion) )
   {
      cout << "error => " << WSAVERNOTSUPPORTED << endl;
      WSACleanup();
      return 0;
   }

/* faut pas oublier de lier la librairire aussi, sous Dev-C++ son nom est `libws2_32.a` je crois */


ensuite, pour créer un socket de type SOCK_STREAM(tcp/ip):
SOCKET ton_serveur = socket( AF_INET, SOCK_STREAM, IPPROTO_IP );

/* IPPROTO_IP peut être remplacé par 0 tout simplement */

dans ton code, W_IP est ton socket serveur, c'est sur ce dernier que tu dois appliquer le bind() et le listen().

lorsque tu assigne une adresse à la struct `sockaddr_in`, utilise htonl()
TonSockAddrIn.sin_addr.S_un.S_addr = htonl( INADDR_ANY );

pour rendre la chose encore plus `propre`, met le membre .sin_zero à zéro
memset( TonSockAddrIn.sin.zero, 0, sizeof(TonSockAddrIn.sin.zero) );

par la suite, absolument aucune connexion ne pourat être acceptée par ton serveur, ton listen() est à zéro => ne rien accepter

if ( SOCKET_ERROR != listen( W_IP, 5 ) )
   cout << "GOOD!" << endl;

tu as maintenant une queue de 5 connexions simultanées.
tu as aussi la macro SOMAXCONN qui est définie dans winsock2.h

/* exemple: */
listen( W_IP, SOMAXCONN );

tu devrais regarder du coté de la fonction select(), elle te sera très utile.

lorsque tu accept une nouvelle connexion, utilise un autre socket:
sock_client = accept( W_IP, (struct sockaddr *)&client, sizeof(struct sockaddr_in) );

Pour information, sous Windows, le type SOCKET est un entier non signé.
typedef unsigned int SOCKET;

contrairement sous Linux ou c'est un entier signé, alors utilise soit: unsigned int ou SOCKET.

SOCKET ton_socket;
unsigned int ton_socket;

etc ... etc ... etc ...

Voilà un bon site sur Winsock => [ Lien ]
Un autre => [ Lien ]
Et un autre => [ Lien ]
Un incontournable sous Windows => [ Lien ]


Il y à des exemples sut tout ces sites, faqs, etc ...

~(.:: NitRic ::.)~



Cette discussion est classé dans : int, server, client, sock, cout


Répondre à ce message

Sujets en rapport avec ce message

chat client server [ par electroonn ] Bonjour, j'essaye de developper avec c++ une application de chat (client-server) sous windows, en voici le code:Server server; Client client; void m Client serveur [ par fanch314 ] Je que le serveur et le client échange par internet.Le serveur ne voit pas de client connectéEt le buffer du client contient nimporte quoi.En gros ils Reconnaitre une touche [ par wilvart ] Bonjour, je suis débutant en C++ et j'aimerai savoir comment reconnaitre une touche. Par exemple dans ce programme "Pile ou Face", j'aimerai relancer Problème d'IP Client avec les winsock [ par Cphil51 ] Boujour a tous.Je m'interesse en ce moment aux socket sous windows et j'ai un petit probleme actuellement. J'aimerais savoir comment récupérer l'IP d' Boucle de connection client TCP [ par ssmint ] Bonjour à tous,Mon dernier souci en date est de pouvoir créer une un client qui essaie de se connecter toutes les secondes.Je fais donc une boucle ave fonction accepte bloquante.. [ par ssmint ] Bonjour à tous,nouveau problème de socket, côté server cette fois ci :imaginons que plusieurs clients cherchent à se connecter sur le port d'écoute du Le recv pas bloquant? [ par harddisk ] Hello,j'ai lu un peu partout que le recv est bloquant, hors chez moi ca n'est pas le cas.        int lgdonneesinout;        lgdonneesinout = sizeof(so [dev c++] mot de passe c++ [ par kiki67100 ] Bonjour jaimerais savoir comment faire une petit gestion de mot de passe en c++ voici mon codes mais meme avec un faux mot de passe sa marche /*** PRO code correct mais rien ne s'affiche :( [ par djedu59 ] Bonsoir les programmeurs je suis entrain de creer un programme "nombre mystere" (tres courant ) que j'ai appris grace a un livre et j'essaye maintenan [client pop3]Exception non gérée [ par electron159 ] Bonjour,  je suis sous visual studio, mode console. j'ai essayé d'adapter un client pop3 linux pour qu'il tourne sous windows. Mais, j'ai une exceptio


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version


LG KP501

Entre 9€ et 159€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,546 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.