Serveur / client [Résolu]

Signaler
Messages postés
6
Date d'inscription
mercredi 3 janvier 2007
Statut
Membre
Dernière intervention
5 juillet 2008
-
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
-
Bonjour à tous,


Voilà je débute dans la programmation en C; j'ai suivis attentivement un tutoriel sur le C pour avoir les bases, et là je me lance dans la création d'un serveur + client mais j'ai des petits soucis; voilà la source du serveur mais je n'arrive pas à le compiler,j'ai des erreurs avec les variables; comment faire?


Merci de vos réponses, et soyez indulgent avec moi, je débute


#include <cstdlib>
#include
#include <winsock2.h>

void main()
{
  long port=0;
printf ("port?/n");
    scanf("%ld", port);
    printf("le port est %ld", port);  
    
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0),&WSAData);
   
SOCKET sock;
SOCKET csock;
SOCKADDR_IN sin;
SOCKADDR_IN csin;

sock = socket(AF_INET, SOCK_STREAM, 0);

sin.sin_addr.s_addr            = inet_addr("127.0.0.1");
sin.sin_family                = AF_INET;
sin.sin_port                = htons("%ld",port);

bind(sock, (SOCKADDR *)&sin, sizeof(sin));
listen(sock, 0);

        while(true)
        {
            int sinsize = sizeof(csin);
            if((csock = accept(sock,(SOCKADDR *)&csin,&sinsize)) != INVALID_SOCKET)
            {
            send(csock,"Vous etes connectes\r\n127.0.0.1 sur le port %ld\r\n\r\n",port,0);
           
            }
        }

closesocket(sock);
WSACleanup();

    return EXIT_SUCCESS;
}

11 réponses

Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
17
H:\programmation\démarrage.cpp:7: error: `main' must return `int' => remplacer le void main() par int main()sin.sin_port   htons("%ld",port);> sin.sin_port   = htons(port);
et transformer le long port; en unsignedshortint port;

Cdt
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
17
unsignedshortint c'est en 3 mots c'est unsigned short int.
Désolé c'est le copier coller qui a déconné.
unsigned short int c'est le type du parametre qui est demandé dans le prototype de la fonction htons.
Cdt
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
17
Bonjour.
Tu peux nous donner les messages d'erreurs que tu as ?
Si tu fais du C pur n'oublie pas que les variables doivent être déclarées en début de blocs et que le type booléen n'existe pas
Cdt
Messages postés
6
Date d'inscription
mercredi 3 janvier 2007
Statut
Membre
Dernière intervention
5 juillet 2008

Merci pour la réponse, j'ai déjà remarqué que j'ai oublié le "&" à la ligne printf("le port est %ld", port);
pour les erreurs voici le log, c'est en rapport avec les variables...



Compilateur: Default compiler
Exécution de g++.exe...
g++.exe "H:\programmation\démarrage.cpp" -o "H:\programmation\démarrage.exe" -I"C:\Dev-Cpp\lib\gcc\mingw32\3.4.2\include" -I"C:\Dev-Cpp\include\c++\3.4.2\backward" -I"C:\Dev-Cpp\include\c++\3.4.2\mingw32" -I"C:\Dev-Cpp\include\c++\3.4.2" -I"C:\Dev-Cpp\include" -L"C:\Dev-Cpp\lib"
H:\programmation\démarrage.cpp:7: error: `main' must return `int'
H:\programmation\démarrage.cpp: In function `int main(...)':
H:\programmation\démarrage.cpp:25: error: invalid conversion from `const char*' to `u_short'
C:/Dev-Cpp/include/winsock2.h:609: error: too many arguments to function `u_short htons(u_short)'
H:\programmation\démarrage.cpp:25: error: at this point in file

Exécution terminée

A +
Messages postés
6
Date d'inscription
mercredi 3 janvier 2007
Statut
Membre
Dernière intervention
5 juillet 2008

Merci pour la réponse :)
unsignedshortint port ça marche comment et ça correspond à quoi? Parceque ça me fait toujours un bug H:\programmation\démarrage.cpp:8: error: `unsignedshortint' undeclared (first use this function. J'ai déjà fait des recherches sur le net, mais n'ai pas trouvé grand chose...
A+
Messages postés
6
Date d'inscription
mercredi 3 janvier 2007
Statut
Membre
Dernière intervention
5 juillet 2008

 Bonjour =)
J'ai modifié tout celà maintenant, il n'y a plus d'erreurs de compilation, mais quand j'execute le programme, j'ai le droit à: Erreur de segmentation.
Quelqu'un peut m'expliquer??
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
17
Erreur de segmentation c'est quand tu utilise des pointeurs qui vont lire à a des endroits ou il n'ont pas le droit. Vérifie les paramètres et les valeurs de retour de tes fonctions, rajouter des printf pour pouvoir debugger ton prog.
Bon courage.

ps: recréé un post quand tu aura localiser le bug si tu n'arrives pas à le corriger.
Messages postés
6
Date d'inscription
mercredi 3 janvier 2007
Statut
Membre
Dernière intervention
5 juillet 2008

Merci pour la réponse;
j'ai maintenant le client et le serveur mais pourquoi le goto ne marche pas chez le serveur? parce que sa ne fonctionne qu'une fois (je n'arrive qu'à envoyer un seul message sans mettre le goto, avec le goto, il ne se passe rien sur le serveur...)

//serveur
#include <stdio.h>
#include
#include <winsock.h>

int main()
{
debut:
char buffer[1024];
char buffer1[1024];
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0),&WSAData);
   
SOCKET sock;
sock = socket(AF_INET,SOCK_STREAM,0);
   
SOCKADDR_IN sin;
sin.sin_addr.s_addr = inet_addr("127.0.0.1");
sin.sin_family      = AF_INET;
sin.sin_port        = htons(50);
listen(sock,100);
connect(sock,(SOCKADDR *)&sin,sizeof(sin));

   
int i = recv(sock,buffer,sizeof(buffer),0);
recv(sock,buffer,sizeof(buffer1),0);
goto debut;    

closesocket(sock);
WSACleanup();                     
                           
if (i != false)
    {
    cout << buffer << endl;
    cout << buffer1 << endl;
    }
            getchar();
}

------------------------------------------------------------------------------------------------------------------------------
//client

#include <cstdlib>
#include
#include <winsock2.h>
#include <Windows.h>

using namespace std;

int main(int argc, char *argv[])
{
debut:
    printf("Commandes, en attente de connexion:\n");

char message[100];
long choix =0; 
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0),&WSAData);
   
SOCKET sock;
SOCKET csock;
SOCKADDR_IN sin;
SOCKADDR_IN csin;

sock = socket(AF_INET, SOCK_STREAM, 0);

sin.sin_addr.s_addr            = inet_addr("127.0.0.1");
sin.sin_family                = AF_INET;
sin.sin_port                = htons(50);

bind(sock, (SOCKADDR *)&sin, sizeof(sin));
listen(sock, 0);

        while(true)
        {

            int sinsize = sizeof(csin);
            if((csock = accept(sock,(SOCKADDR *)&csin,&sinsize)) != INVALID_SOCKET)
            {
            send(csock,"Vous etes connecte\r\n",1024,0);
            printf("\n contenu du message? \n");
            gets(message);
            send(csock,message,1024,0);
            printf("venir au debut: 1? \n");
scanf("%ld", &choix) ;          
if(true);
goto debut;            
        
            }   
         }
closesocket(sock);
WSACleanup();

   
    system("PAUSE");
    return EXIT_SUCCESS;
}
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
17
N'utilise pas les goto, c'est hyper déconseillé pour faire un code clair. Utilise plutôt un while : c'est plus "propre".
N'aurais pas tu inversé le code du serveur et du client ? car le premier code "serveur" resemble plus à un code client.
Il faut boucler uniquement sur les receive,
//debut: // <==pas ici
char buffer[1024];
char buffer1[1024];
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0),&WSAData);
   
SOCKET sock;
sock = socket(AF_INET,SOCK_STREAM,0);
   
SOCKADDR_IN sin;
sin.sin_addr.s_addr = inet_addr("127.0.0.1");
sin.sin_family      = AF_INET;
sin.sin_port        = htons(50);
listen(sock,100);
connect(sock,(SOCKADDR *)&sin,sizeof(sin));

debut; // mais boucler a ce niveau, en remplacant ce goto par un while.
int i = recv(sock,buffer,sizeof(buffer),0);
recv(sock,buffer,sizeof(buffer1),0);
goto debut;    
Messages postés
6
Date d'inscription
mercredi 3 janvier 2007
Statut
Membre
Dernière intervention
5 juillet 2008

Je' ne voyait pas trop comment faire, donc j'ai  gardé le goto;
mais sa ne fonctionne toujours pas, en fait, si je lance la partie devant réceptionner le message avant la partie ou j'écris le message, il ne se passe rien...
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
17