Serveur / client

Résolu
the68 Messages postés 6 Date d'inscription mercredi 3 janvier 2007 Statut Membre Dernière intervention 5 juillet 2008 - 3 juil. 2008 à 13:13
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 - 5 juil. 2008 à 11:21
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

cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
3 juil. 2008 à 18:50
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
3
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
4 juil. 2008 à 11:01
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
3
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
3 juil. 2008 à 15:56
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
0
the68 Messages postés 6 Date d'inscription mercredi 3 janvier 2007 Statut Membre Dernière intervention 5 juillet 2008
3 juil. 2008 à 16:44
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 +
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
the68 Messages postés 6 Date d'inscription mercredi 3 janvier 2007 Statut Membre Dernière intervention 5 juillet 2008
4 juil. 2008 à 10:52
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+
0
the68 Messages postés 6 Date d'inscription mercredi 3 janvier 2007 Statut Membre Dernière intervention 5 juillet 2008
4 juil. 2008 à 14:07
 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??
0
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
4 juil. 2008 à 14:34
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.
0
the68 Messages postés 6 Date d'inscription mercredi 3 janvier 2007 Statut Membre Dernière intervention 5 juillet 2008
4 juil. 2008 à 23:30
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;
}
0
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
5 juil. 2008 à 00:39
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;    
0
the68 Messages postés 6 Date d'inscription mercredi 3 janvier 2007 Statut Membre Dernière intervention 5 juillet 2008
5 juil. 2008 à 11:12
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...
0
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
5 juil. 2008 à 11:21
0
Rejoignez-nous