begin process at 2012 05 29 23:20:59
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Liaison client/serveur (socket)


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

Liaison client/serveur (socket)

samedi 13 novembre 2004 à 19:16:29 | Liaison client/serveur (socket)

bthivent

Bonjour !
J'ai suivi un tutorial pour apprendre les sockets. J'ai ensuite essaiyé un exemple qu'ils proposaient, voici mon code qui permet de faire un serveur, et d'envoyer un message à ceux qui s'y connectent :
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(23);
bind(sock, (SOCKADDR *)&sin, sizeof(sin));
listen(sock, 0);
cout << "Serveur en route...";
while(1)
{
int sinsize = sizeof(csin);
if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET)
{
send(csock, "Bienvenue chez moi !\r\n", 14, 0);
}
}


Je ne sais pas si ca marche, et j'ai donc voulu tester en créant un prog qui se connecte sur mon pc, le code client :
char addrip[30];
cout << "Adresse ip du serveur ?";
cin >> addrip;
cout << "Nous allons tenter une connection au serveur : " << addrip << endl;

WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
SOCKET sock;
SOCKADDR_IN sin;
sock = socket(AF_INET, SOCK_STREAM, 0);
sin.sin_addr.s_addr = inet_addr(addrip);
sin.sin_family = AF_INET;
sin.sin_port = htons(4148);
bind(sock, (SOCKADDR *)&sin, sizeof(sin));
connect(sock, (SOCKADDR *)&sin, sizeof(sin));


Mais dès que je me connecte (si je me connecte) en rentrant mon adresse ip de réseau local, je n'obtient aucun message.. Mon code semble pourtant bon ? Mais il doit manquer quelquechose...
Enfin voilà, merci pour votre aide !
bthivent, jeune programmeur c++ dans ses débuts
samedi 13 novembre 2004 à 19:20:20 | Re : Liaison client/serveur (socket)

bthivent

Euh j'ai oublié de parlé du plus important lol.. Il faut que j'utilise un port, car on entre mon adresse ip, mais je ne sais pas quel est le port pour pouvoir accéder a mon ordi. voilà..
@++
bthivent, jeune programmeur c++ dans ses débuts
samedi 13 novembre 2004 à 19:44:17 | Re : Liaison client/serveur (socket)

aardman

Membre Club
Salut,
Ton serveur ecouter sur le port 23, et tu essayes de te connecter au port 4148..
samedi 13 novembre 2004 à 20:31:16 | Re : Liaison client/serveur (socket)

bthivent

Merci ! j'ai essayé de mettre les deux à 4148, et ça marche pas... j'ai essayé avec les deux a 23 et ca marche pas non plus... que faire ?
bthivent, jeune programmeur c++ dans ses débuts
samedi 13 novembre 2004 à 20:56:39 | Re : Liaison client/serveur (socket)

aardman

Membre Club
Salut,
Coté client, on ne doit pas appeler bind(...). C'est connect(...) qui choisi le port local implicitement.
Ici ton client et ton serveur essayent de binder sur le meme port, ca peut peut etre poser probleme.

Sinon tu n'a pas mis de traitement d'erreur dans ton code, pas tres pratique pour débuger, donc pour chaque fonction il faut tester sa valeur de retour (SOCKET_ERROR ou non) et si une fonction retourne SOCKET_ERROR, il faut appeler WSAGetLastError() et afficher le numéro de l'erreur.
samedi 13 novembre 2004 à 21:53:46 | Re : Liaison client/serveur (socket)

bthivent

Donc je dois enlever le bind du client.. ?
et comment utiliser SOCKET_ERROR ? Je le met dans chaque fonction que j'utilise pour créer le socket (par fonction(machin machin != SOCKET_ERROR)je crois ?) ??
bthivent, jeune programmeur c++ dans ses débuts
samedi 13 novembre 2004 à 22:01:38 | Re : Liaison client/serveur (socket)

aardman

Membre Club
Réponse acceptée !
Salut,
oui il faut virer le bind du client.

et pour l'affichage des erreurs:

sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock == SOCKET_ERROR)
printf("erreur socket(): %d\n", WSAGetLastError());

... a repeter pour toutes les fonctions utilisées: bind, listen, connect.
Pour la fonction accept(...) c'est un peu different puisqu'elle retourne INVALID_SOCKET si elle échoue.
samedi 13 novembre 2004 à 22:09:44 | Re : Liaison client/serveur (socket)

bthivent

Ok Merci, je vais essayer, ++ !
bthivent, jeune programmeur c++ dans ses débuts
dimanche 14 novembre 2004 à 09:21:28 | Re : Liaison client/serveur (socket)

bthivent

Il semble qu'il n'y ait aucune erreur.. j'ai fait comme tu m'as dit pour le socket, et pour le bind, le connect et le listen j'ai fait comme ca:
if(bind(sock, (SOCKADDR *)&sin, sizeof(sin)) == SOCKET_ERROR)
printf("erreur bind(): %d\n", WSAGetLastError());

if(listen(sock, 0) == SOCKET_ERROR)
printf("erreur listen(): %d\n", WSAGetLastError());

if(connect(sock, (SOCKADDR *)&sin, sizeof(sin)) == SOCKET_ERROR)
printf("erreur connect(): %d\n", WSAGetLastError());


Je ne sais pas si c'est la bonne façon...

J'ai un peu évoluer mon code : au démarrage du serveur, je demande sur quel port le serveur sera "accessible". Au démmarage du client, je demande l'adresse ip et le port du serveur... comme ça je peu tester plusieurs valeurs rapidement, mais ca ne marche pas.
Peut-être parce que je fais mes teste de mon ordi à mon ordi ? il faut puet-être que j'essaie de connecter deux ordis différents ?

Merci ! et @+

bthivent, jeune programmeur c++ dans ses débuts
dimanche 14 novembre 2004 à 10:30:47 | Re : Liaison client/serveur (socket)

bthivent

Voici une image du serveur :


et du client :


Normallement sur l'image ci-dessus, je devrai avoir le message : "Bienvenue chez moi" avant que "Appuyez sur une touche pour continuer"... apparaîsse...

Et voici mes code complets
serveur :
#include <iostream>
#include <stdlib.h>
#include <winsock2.h>

using namespace std;

int main(int argc, char *argv[])
{
cout << "**********Serveur**********" << endl;
int port;
cout << "Port que doit utiliser le serveur :";
cin >> 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);
if(sock == SOCKET_ERROR)
printf("erreur socket(): %d\n", WSAGetLastError());
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_family = AF_INET;
sin.sin_port = htons(port);
if(bind(sock, (SOCKADDR *)&sin, sizeof(sin)) == SOCKET_ERROR)
printf("erreur bind(): %d\n", WSAGetLastError());
if(listen(sock, 0) == SOCKET_ERROR)
printf("erreur listen(): %d\n", WSAGetLastError());
cout << "Serveur en route...\nPort = " << port;

while(1)
{
int sinsize = sizeof(csin);
if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET)
{
send(csock, "Bienvenue chez moi !\r\n", 14, 0);
}
}

system("PAUSE");
return 0;
}


client :
#include <iostream>
#include <stdlib.h>
#include <winsock2.h>

using namespace std;

int main(int argc, char *argv[])
{
cout << "**********Client**********" << endl;
char addrip[30];
int port;
cout << "Adresse ip du serveur ?";
cin >> addrip;
cout << "Port du serveur ?";
cin >> port;
cout << "Nous allons tenter une connection au serveur : " << addrip << "\npar le port " << port << endl;

WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
SOCKET sock;
SOCKADDR_IN sin;
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock == SOCKET_ERROR)
printf("erreur socket(): %d\n", WSAGetLastError());
sin.sin_addr.s_addr = inet_addr(addrip);
sin.sin_family = AF_INET;
sin.sin_port = htons(port);
if(connect(sock, (SOCKADDR *)&sin, sizeof(sin)) == SOCKET_ERROR)
printf("erreur connect(): %d\n", WSAGetLastError());
system("PAUSE");
return 0;
}


bthivent, jeune programmeur c++ dans ses débuts

1 2

Cette discussion est classée dans : socket, sin, sock, sockaddr, wsadata


Répondre à ce message

Sujets en rapport avec ce message

PROB SOCKETS CON [ par zzzzzz ] le code source marche mais quand je rajoute un cout#include #pragma comment(lib,"ws2_32.lib")#include int main(void) Probleme de Client Serveur [ par Krox68 ] voila jaimerais faire un programme client qui puisse se connecter a ce serveur : #include void main(){ WSADATA WSAData; WSAStartup(MAKEWORD(2,0), &WS LERREUR QUI TUE §§§§§§§§§§§§§§§§ [ par Avalon10101 ] Vla jai fé mon prog tout é juste mais ya une erreur que je narrive vraiment pas à comprendre ! :C:\Documents and Settings\Alex\Mes documents\Makefile. [SOCKET]Tjrs le pb de recuperation du buffer recv() [ par enthaz ] Allez J me lance : ca fait des heures et des heures ke le newb ke je suischerche la solution :D un coté j ai un logiciel client ki envoie "coucou" sur Socket, quand tu nous tiens ... [ par enthaz ] Allez J me lance : ca fait des heures et des heures ke le newb ke je suischerche la solution :D un coté j ai un logiciel client ki envoie "coucou" sur prob sock [ par epoc ] voilà, g commencé la prog des socks en vc++, mais rien ne transitte alors que la connexion semble être bien effectuée, voilà le code :**************** [devcpp] erreur de lieur [ par Ar4gorn ] Bonjour, Voila je developpe un leger client-serveur et avec dev-cpp c'est galere du moins au niveau de l'édition des liens. Je ne sais pas quoi mettr utilisation basique de winsock [ par Spiffou ] bonjour à tousj'essaie d'apprendre winsock en vc++ mode console pour le moment, et j'ai qlq difficultés...en gros j'etabli bien une connection entre l Socket Server/Client [ par XKaliBur ] Je suis débutant et je voudrais faire en sorte d'envoyer un message au mon serveur et des que ce dernier reçoit un message, il réponde en fonction de socket envoie de text d'apres un fichier [ par hijakhakker ] salutj'utilise recement les socket et je teste une source qui utilise les socket pour envoyer hello world a qui se connect :#include #pragma comment(l


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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 : 2,044 sec (4)

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