Liaison client/serveur (socket)

Résolu
bthivent Messages postés 49 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 26 janvier 2005 - 13 nov. 2004 à 19:16
amou_arby Messages postés 1 Date d'inscription jeudi 19 mai 2005 Statut Membre Dernière intervention 24 mai 2005 - 24 mai 2005 à 21:28
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 ;)

13 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
13 nov. 2004 à 22:01
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.
3
bthivent Messages postés 49 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 26 janvier 2005 3
13 nov. 2004 à 19:20
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 ;)
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
13 nov. 2004 à 19:44
Salut,
Ton serveur ecouter sur le port 23, et tu essayes de te connecter au port 4148..
0
bthivent Messages postés 49 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 26 janvier 2005 3
13 nov. 2004 à 20:31
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 ;)
0

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

Posez votre question
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
13 nov. 2004 à 20:56
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.
0
bthivent Messages postés 49 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 26 janvier 2005 3
13 nov. 2004 à 21:53
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 ;)
0
bthivent Messages postés 49 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 26 janvier 2005 3
13 nov. 2004 à 22:09
Ok Merci, je vais essayer, ++ !
bthivent, jeune programmeur c++ dans ses débuts ;)
0
bthivent Messages postés 49 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 26 janvier 2005 3
14 nov. 2004 à 09:21
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 ;)
0
bthivent Messages postés 49 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 26 janvier 2005 3
14 nov. 2004 à 10:30
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 
#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 
#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 ;)
0
bthivent Messages postés 49 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 26 janvier 2005 3
14 nov. 2004 à 12:19
Eh bien encore du nouveau, j'ai enfin réussi a tester si la connexion existait...
Ceci n'apparait que quand le client est lancé sur un autre ordi, en entrant mon ip et le bon port :

Le problème doit être dans le code, ou il doit manquer quelquechose...

bthivent, jeune programmeur c++ dans ses débuts ;)
0
bthivent Messages postés 49 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 26 janvier 2005 3
14 nov. 2004 à 12:32
Bon ben finalement tout marche, je me suis un peu débrouillé, j'ai ajouté un recv, puis ca marche lol...
Voilà ;)
bthivent, jeune programmeur c++ dans ses débuts ;)
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
14 nov. 2004 à 17:17
Salut,
Ce qui est important dans ce genre de prog de test c'est l'affichage des erreurs, c'est ca qui permet d'avancer.
Sinon pour etablir des connexions entre des ports d'une meme machine, il faut utiliser l'adresse 127.0.01 (adresse qui est faite pour ca).
Un dernier truc:
send(csock, "Bienvenue chez moi !\r\n", 14, 0);
"Bienvenue chez moi !\r\n"
moi je compte 22 caracteres, 23 si l'on compte le zéro final de la chaine.
0
amou_arby Messages postés 1 Date d'inscription jeudi 19 mai 2005 Statut Membre Dernière intervention 24 mai 2005
24 mai 2005 à 21:28
s.t.p j'ai besoin de ton aide pour un projet que j'ai et il me reste plus beaucoup de temps pour concevoir un serveur de fichiers. si tu peux me donner un coup de main. mon couriel est : [mailto:oula07@uqo.ca oula07@uqo.ca]
merci dans le deux cas.
0
Rejoignez-nous