Problème de bind()
TiTo_97116
-
TiTo_97116 -
TiTo_97116 -
Bonjour a tous et a toutes. Je suis actuellement en deuxième année de BTS et j'ai réalisé un projet. j'ai créé une classe serveur en tcp/ip. je réussi à créer ma socket, la paramètre. Mais quand je veux établir le lien ma fonction bind me renvoie systématiquement -1. Voici le .h de ma class
//---------------------------------------------------------------------------
#ifndef Server_socketH
#define Server_socketH
#include<vcl.h>
//---------------------------------------------------------------------------
#include <winsock2.h>
typedef int socklen_t;
class server_socket
{
SOCKET sock;//sock sera la socket créé par le serveur et csock sera la sockette du client
int client_socket;//ce sera la socket du client
SOCKADDR_IN sin;//C'est une sturcture de la bibliotèque winsock2.h
public:
server_socket();//paramètre la socket serveur
void parametrer_socket();//Permet de créer la socket qui permétra de la connaitre
void etablier_lien_socket(); //sert à établir la connexion des sockets
int ecoute_socket();//ecoute le réseau pour savoir si une connexion veut etre établie
int accepter_socket_client();//accepte le client voulant se connecter à la socket
void desactiver_socket();//désactive la socket
void envoie_socket_server(char*trame);//envoie une chaine de caractere
char* envoie_socket_server();//recoit une socket d'un client
};
#endif
et voici le .cpp de ma class ->
//---------------------------------------------------------------------------
#pragma hdrstop
#include "Server_socket.h"
#if defined (WIN32)
WSADATA WSAData;
int erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
#else
int erreur = 0;
#endif
//---------------------------------------------------------------------------
server_socket::server_socket()//Crée la socket
{
sock=socket(AF_INET, SOCK_STREAM, 0);//AF_INEt pour un protocole TCP IP et SOCK_STREAM pour le type de services
}
void server_socket:: parametrer_socket()//paramètre la socket
{
sin.sin_family = AF_INET;//comme expliqué précédement c'est pour désigner le protocole TCP IP
//sin.sin_addr.s_addr = htonl(INADDR_ANY);//adresse IP attribué automatiquement au server, htonl(INADDR_ANY) est une fonction ->
//->qui permétra de la connaitre
sin.sin_addr.s_addr =inet_addr("127.0.0.1");
sin.sin_port = htons(1500);//Correspond au port atribué. Grace a la fonction htons
}
void server_socket::etablier_lien_socket()//sert à établir la connexion des sockets
{
int check;
check=bind(sock,(SOCKADDR*)&sin,sizeof(sin));
switch (check)
{
case EBADF:
MessageBox(NULL,"L'argument de la socket n'est pas valide","Information",MB_ICONINFORMATION);
break;
case -1:
MessageBox(NULL,"L'argument de la socket n'est pas valide","Information",MB_ICONINFORMATION);
break;
case EACCES:
MessageBox(NULL,"Vous n'avez pas accès à l'adresse","Information",MB_ICONINFORMATION);
break;
case EINVAL:
MessageBox(NULL,"La socket a déja une adresse","Information",MB_ICONINFORMATION);
break;
}
if(check==SOCKET_ERROR)
int x=5;
}
int server_socket::ecoute_socket()//ecoute le réseau pour savoir si une connexion veut etre établie
{
int check;
check=listen(sock,10);//La lecture sur le réseau se fait par la fonction listen. Le
if(check!=SOCKET_ERROR)
MessageBox(NULL,"Demande de connection","Information",MB_ICONINFORMATION);
return check;
}
int server_socket::accepter_socket_client()//accepte le client qui veut se connecter a la socket
{
socklen_t taille = sizeof(sin);
int check;
check=accept(sock, (SOCKADDR*)&sin,&taille);
return check;
}
void server_socket::desactiver_socket()//désactive la socket
{
int x;
x=closesocket(sock);
#if defined (WIN32)
WSACleanup();
#endif
}
void server_socket::envoie_socket_server(char*trame)//envoie une socket au client connecté
{
bool test;//variable grace a laquelle on saura si lenvoi du message a été fais
test=send(client_socket, trame,strlen(trame), 0);//fonction envoyant la trame au client
if(test == SOCKET_ERROR)
MessageBox(NULL,"Connection établie","Information",MB_ICONINFORMATION);
}
#pragma package(smart_init)
Je vous remercie d'avance
//---------------------------------------------------------------------------
#ifndef Server_socketH
#define Server_socketH
#include<vcl.h>
//---------------------------------------------------------------------------
#include <winsock2.h>
typedef int socklen_t;
class server_socket
{
SOCKET sock;//sock sera la socket créé par le serveur et csock sera la sockette du client
int client_socket;//ce sera la socket du client
SOCKADDR_IN sin;//C'est une sturcture de la bibliotèque winsock2.h
public:
server_socket();//paramètre la socket serveur
void parametrer_socket();//Permet de créer la socket qui permétra de la connaitre
void etablier_lien_socket(); //sert à établir la connexion des sockets
int ecoute_socket();//ecoute le réseau pour savoir si une connexion veut etre établie
int accepter_socket_client();//accepte le client voulant se connecter à la socket
void desactiver_socket();//désactive la socket
void envoie_socket_server(char*trame);//envoie une chaine de caractere
char* envoie_socket_server();//recoit une socket d'un client
};
#endif
et voici le .cpp de ma class ->
//---------------------------------------------------------------------------
#pragma hdrstop
#include "Server_socket.h"
#if defined (WIN32)
WSADATA WSAData;
int erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
#else
int erreur = 0;
#endif
//---------------------------------------------------------------------------
server_socket::server_socket()//Crée la socket
{
sock=socket(AF_INET, SOCK_STREAM, 0);//AF_INEt pour un protocole TCP IP et SOCK_STREAM pour le type de services
}
void server_socket:: parametrer_socket()//paramètre la socket
{
sin.sin_family = AF_INET;//comme expliqué précédement c'est pour désigner le protocole TCP IP
//sin.sin_addr.s_addr = htonl(INADDR_ANY);//adresse IP attribué automatiquement au server, htonl(INADDR_ANY) est une fonction ->
//->qui permétra de la connaitre
sin.sin_addr.s_addr =inet_addr("127.0.0.1");
sin.sin_port = htons(1500);//Correspond au port atribué. Grace a la fonction htons
}
void server_socket::etablier_lien_socket()//sert à établir la connexion des sockets
{
int check;
check=bind(sock,(SOCKADDR*)&sin,sizeof(sin));
switch (check)
{
case EBADF:
MessageBox(NULL,"L'argument de la socket n'est pas valide","Information",MB_ICONINFORMATION);
break;
case -1:
MessageBox(NULL,"L'argument de la socket n'est pas valide","Information",MB_ICONINFORMATION);
break;
case EACCES:
MessageBox(NULL,"Vous n'avez pas accès à l'adresse","Information",MB_ICONINFORMATION);
break;
case EINVAL:
MessageBox(NULL,"La socket a déja une adresse","Information",MB_ICONINFORMATION);
break;
}
if(check==SOCKET_ERROR)
int x=5;
}
int server_socket::ecoute_socket()//ecoute le réseau pour savoir si une connexion veut etre établie
{
int check;
check=listen(sock,10);//La lecture sur le réseau se fait par la fonction listen. Le
if(check!=SOCKET_ERROR)
MessageBox(NULL,"Demande de connection","Information",MB_ICONINFORMATION);
return check;
}
int server_socket::accepter_socket_client()//accepte le client qui veut se connecter a la socket
{
socklen_t taille = sizeof(sin);
int check;
check=accept(sock, (SOCKADDR*)&sin,&taille);
return check;
}
void server_socket::desactiver_socket()//désactive la socket
{
int x;
x=closesocket(sock);
#if defined (WIN32)
WSACleanup();
#endif
}
void server_socket::envoie_socket_server(char*trame)//envoie une socket au client connecté
{
bool test;//variable grace a laquelle on saura si lenvoi du message a été fais
test=send(client_socket, trame,strlen(trame), 0);//fonction envoyant la trame au client
if(test == SOCKET_ERROR)
MessageBox(NULL,"Connection établie","Information",MB_ICONINFORMATION);
}
#pragma package(smart_init)
Je vous remercie d'avance
2 réponses
Salut.
déjà, je trouve ton code bien présenté, même si tu n'as pas utiliser les balises de code qui permettent de conserver l'indentation. Il est lisible et tout. Juste une petite remarque sur le .h, met des espaces entre les déclaration et le commentaire associé, comme pour une sorte de tableau.
J'aurai plutôt mis :
check=bind(sock,(SOCKADDR*)&sin,sizeof(SOCKADDR));
J'ai aussi un petit doute avec les WSA machin, tu les met dans ton .c de classe, moi je mets ça dans le main, ou vu que tu nettoyes dans une fonction membre, je ferai l'appel directement dans une fonction membre.
Bon courage.
déjà, je trouve ton code bien présenté, même si tu n'as pas utiliser les balises de code qui permettent de conserver l'indentation. Il est lisible et tout. Juste une petite remarque sur le .h, met des espaces entre les déclaration et le commentaire associé, comme pour une sorte de tableau.
J'aurai plutôt mis :
check=bind(sock,(SOCKADDR*)&sin,sizeof(SOCKADDR));
J'ai aussi un petit doute avec les WSA machin, tu les met dans ton .c de classe, moi je mets ça dans le main, ou vu que tu nettoyes dans une fonction membre, je ferai l'appel directement dans une fonction membre.
Bon courage.