logo

Client/Serveur

C'est ici que vous posterez vos questions sur la programmation réseau (socket, connexion TCP/UDP...)

Client/Serveur

Messagede Nahmani » 18 Mai 2010, 13:03

donc je désire faire un reseau client/serveur

et je bute sur des problème assez bizzare
si vous pouvez m'eclairer sur des betise faire ou bien si vous pouvez m'aider a corriger quelque probleme merci .

#include<string>
#include<iostream>
using namespace std;


#include <stdio.h>
#include "winsock2.h"

void main()
{
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 = INADDR_ANY;
sin.sin_family = AF_INET;
sin.sin_port = htons(5500);
if(bind(sock, (SOCKADDR *)&sin, sizeof(sin)) < 0)
cout<<"error bind";
else
cout<<"bind ok";
if(listen(sock, 0)<0)
cout<<"erreur de listen";
else
cout<<"listen ok";
while(true)
{
int sinsize = sizeof(csin);
if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET)
{
if(send(csock, "yes!", 4, 0)<0)
cout<<"error send";
else
cout<<"send ok !";
}
}
}

il s'agit d'un serveur banal mais cependant il me provoque beaucoup d'erreur de ce genre :
Erreur 1 error LNK2019: symbole externe non résolu __imp__send@16 référencé dans la fonction _main main.obj
Erreur 2 error LNK2019: symbole externe non résolu __imp__accept@12 référencé dans la fonction _main main.obj
Erreur 3 error LNK2019: symbole externe non résolu __imp__listen@8 référencé dans la fonction _main main.obj
Erreur 4 error LNK2019: symbole externe non résolu __imp__bind@12 référencé dans la fonction _main main.obj
Erreur 5 error LNK2019: symbole externe non résolu __imp__htons@4 référencé dans la fonction _main main.obj
Erreur 6 error LNK2019: symbole externe non résolu __imp__socket@12 référencé dans la fonction _main main.obj
Erreur 7 error LNK2019: symbole externe non résolu __imp__WSAStartup@8 référencé dans la fonction _main main.obj
Erreur 8 error LNK2019: symbole externe non résolu _WinMain@16 référencé dans la fonction ___tmainCRTStartup MSVCRTD.lib
Erreur 9 fatal error LNK1120: 8 externes non résolus C:\Users\nando\Documents\Visual Studio 2008\Projects\serveur\Debug\serveur.exe
Nahmani
 

Re: Client/Serveur

Messagede Invité » 18 Mai 2010, 13:17

il semblerait qu'il me manque une librairie.
j'ai reinstallée visual studio mais le problème persiste
Invité
 

Re: Client/Serveur

Messagede nahmani » 18 Mai 2010, 13:33

problème résolu
il fallait rajouter la librairie ws2_32.lib dans les linker.
de plus il ne fallait pas crée dans un projet console32 mais un projet simple
nahmani
 

Re: Client/Serveur

Messagede Tibo » 18 Mai 2010, 14:18

Content de voir que j'ai été utile sur ce coup ;)

Bon courage pour la suite !
Tibo
Administrateur du site
 
Messages: 147
Inscription: 26 Mar 2008, 13:58

Re: Client/Serveur

Messagede nahmani » 18 Mai 2010, 15:51

bon alors je suis passer a quelque chose de plus avancé.
j'avai repris le msn que on avait fait en cours simplement pour me familiariser et mieux comprendre le tout j'ai voulu mettre 2 thread dans le client et le serveur un pour l'ecoute en continu et un pour l'ecriture et l'emission.
simplement les thread ne se reconnaisse pas voyer si vous pouvez m'eclaircir.

le .h:
Code: Tout sélectionner
#pragma once
#include<winsock2.h>
#include <iostream>
#include <windows.h>
#include <string>
using namespace std;

class Connexion
{
protected:
SOCKET monSocket;


public:
   static DWORD WINAPI reception(LPVOID param);
   static DWORD WINAPI emission(LPVOID param);
    Connexion();
    ~Connexion();
    void servir();
    void  contacter(string);
    void envoyer(string);
    string recevoir();
};


le fichier .cpp
je passe tout les detail je met juste les thread crée .
Code: Tout sélectionner
DWORD WINAPI Connexion::reception(LPVOID param)
{
   
   Connexion *C=(Connexion*)param;

   while(phrase!="bye")
   {
      cout<<C->recevoir();
      
   }

   return 1;
};
DWORD WINAPI Connexion::emission(LPVOID param)
{

   Connexion *C=(Connexion*)param;

   while(phrase!="bye")
   {
      getline(cin,phrase);
      C->envoyer(phrase);


   }

   return 1;
};

et le main:
Code: Tout sélectionner
#include "Connexion.h"


void main()
{
   Connexion c;
   string phrase;// declare une phrase

   c.servir();//permet de recevoir des client
   //c.contacter("127.0.0.1"); si je veut devenir client et enlever c.servir();
   
   cout<<"serveur dit"<<endl;
   getline(cin,phrase);
   c.envoyer(phrase);
   while(phrase!="bye")
   {
      CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)reception,NULL,NULL,NULL);
      CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)emission,NULL,NULL,NULL);

   }

   cout<<"attent d'un message"<<endl;
   cout<<c.recevoir()<<endl;



};


voila.
je pense que pour que il n'y ai pas de bug le mieux serai qu'a chaque envoi j'efface la valeur de" phrase" pour pas envoyer des envoi répéter et de mettre une sécurité pour éviter cela

sinon dans les erreur actuel il ne reconnait pas emission et reception pourquoi ?
nahmani
 

Re: Client/Serveur

Messagede Tibo » 18 Mai 2010, 15:57

Salut,
j'ai pas compris ce que tu voulais faire...
En tout cas, ce que tu as fait pour l'instant n'est pas bon du tout ! Juste sur la boucle principale :
Code: Tout sélectionner
while(phrase!="bye")
{
CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)reception,NULL,NULL,NULL);
CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)emission,NULL,NULL,NULL);

}

Comme CreateThread est une fonction qui lance le processus puis continue l'exécution, tu es en train de lancer des millions de processus !

Ensuite, je ne comprend pas pourquoi tu as besoin de 3 threads (le main, reception et emission ?)
Pour moi, deux aurait été suffisant ! Explique moi pourquoi tu penses que c'est utile.

Voila pour les erreurs de logiques (plus importantes)
Pour ce qui est du compilateur qui ne te reconnait pas reception et emission, c'est parce qu'il faut donner le nom complet :
Connexion::reception
Tibo
Administrateur du site
 
Messages: 147
Inscription: 26 Mar 2008, 13:58

Re: Client/Serveur

Messagede nahmani » 18 Mai 2010, 16:06

oui j'avai aussi corriger les erreur de placement des thread .
en faite ce que je veut c'est que pendant que le thread principale attend patiemment les 2 autre thread envoi en continu les phrase ecrite et l'autre thread écoute tout le temp des que une phrase est écrite.

CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)reception,NULL,NULL,NULL);
CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)emission,NULL,NULL,NULL);
while(phrase!="bye")
{
Sleep(10);
}
nahmani
 

Re: Client/Serveur

Messagede Tibo » 18 Mai 2010, 18:00

D'accord, mais dans ce cas, t'es d'accord pour dire que le main ne sert plus à rien (toutes les 10 millisecondes, il teste si on a reçu "bye"...

L'idée serait plutôt d'avoir un thread qui envoit tout le temps et le main qui fait uniquement la reception (ou l'inverse, c'est pareil)

Dans tous les cas, tu n'as besoin que d'un seul thread (en plus du thread principal).

Mais bon, je ne vois pas trop le rapport avec ton projet...
Tibo
Administrateur du site
 
Messages: 147
Inscription: 26 Mar 2008, 13:58

Re: Client/Serveur

Messagede nahmani » 18 Mai 2010, 18:29

si tout fonctionne j'aurai la structure pour mon projet.

car je vais avoir besoin d'un thread a mon avis a part si mon binome m'envoie en meme temp les donnée a l'ascenseur au reseau je vais voir sa .
(au pire ca me permet d'apprendre comment ca fonctionne le reseau)
nahmani
 


Retourner vers Programmation réseau

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron
Hit-Parade des sites francophones