begin process at 2010 03 18 18:21:02
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Un peu d'aide pour un serveur


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Un peu d'aide pour un serveur

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ée 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

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,437 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales