Bonjour,
je souhaiterais faire passer des informations d'un ordinateur A a un ordinateur B par le reseau internet. J'ai donc fait des recherche et je suis arriver au sujet des sockets, je ne connaissais méme pas se mot avant ...
je programme en c++, je ne suis pas un cador mais j'ai quelques notion avec lesquels j'arrive a me débrouiller.
j'ai donc chercher a réaliser un socket en c++, grace a se site j'ai trouver de quoi faire un bon début.
http://c.developpez.com/cours/socket...p-demystifies/
j'ai donc réaliser deux programme différent, un pour le serveur et l'autre pour le client voila se que sa donne.
client
serveurvoid __fastcall TForm1::Button1Click(TObject *Sender)
{
WSADATA WSAData; //initialisation WSADATA utilisée pour le démarrage de WSAStartup()
WSAStartup(MAKEWORD(2,0), &WSAData); // permet de dire à l'ordinateur que vous allez utiliser des sockets
//Création du socket
SOCKET sock; // init de la variable sock type socket
SOCKADDR_IN sin; //SOCKADDR contient les informations techniques du socket
sin.sin_addr.s_addr = inet_addr("adresse IP de mon PC A"); //adresse du serveur
sin.sin_family = AF_INET; //type de socket
sin.sin_port = htons(23); //utilisation du port telnet
sock = socket(AF_INET,SOCK_STREAM,0); //création su socket ( STREAM aprés il faut faire accept() ou de connect() et pas DGRAM)
bind(sock, (SOCKADDR *)&sin, sizeof(sin)); //attache le socket directement au port et à l'adresse
//connection avec le serveur
connect(sock, (SOCKADDR *)&sin, sizeof(sin)); //permet de se connecter
send(sock, "Ceci est un test!\r\n", 19, 0); //envoi d'un string de 19 caracteres
closesocket(sock); // ferme le socket
WSACleanup(); //nettoyage WSA
}
mais je ne reçoi absolument rien ou alors je ne sais pas lire mais une chose est sur je ne change jamais le caption de mon label.void __fastcall TForm1::Button1Click(TObject *Sender)
{
WSADATA WSAData; //initialisation WSADATA utilisée pour le démarrage de WSAStartup()
WSAStartup(MAKEWORD(2,0), &WSAData); // permet de dire à l'ordinateur que vous allez utiliser des sockets
SOCKET sock; // init de la variable sock type socket
SOCKADDR_IN sin; //SOCKADDR contient les informations techniques du socket
sin.sin_addr.s_addr = htonl(INADDR_ANY); //adresse du serveur se pc (A)
sin.sin_family = AF_INET; //type de socket
sin.sin_port = htons(23); //utilisation du port telnet
sock = socket(AF_INET,SOCK_STREAM,0); //création su socket ( STREAM aprés il faut faire accept() ou de connect() et pas DGRAM)
bind(sock, (SOCKADDR *)&sin, sizeof(sin)); //attache le socket directement au port et à l'adresse
listen(sock, 0); //scrutation du port du socket, Le 1er paramètre, sock, est le socket sur lequel le listen() écoutera. Le 2ème paramètre s'appelle le BACKLOG. C'est le nombre maximum de connexions qui seront écoutées en même temps.
int val = 0; //déclaration d'une variable, utiliser pour le retour de accept, vérification du socket
while(CheckBox1->Checked==FALSE ) //boucle
{
int sizeof_sin = sizeof(sin); //définition de la taille du socket
val = accept(sock, (SOCKADDR *)&sin, &sizeof_sin); //permet d'accepter une connexion 1er paramètre : le socket. Le 2ème paramètre est votre SOCKADDR_IN que vous avez créé pour prendre les informations du client connecté sur votre serveur. Le 3ème et dernier paramètre est un pointeur vers la variable qui va recevoir le nombre d'octets écrits dans votre SOCKADDRIN. La variable doit être initialisée avec la taille de cette structure.
if(val != INVALID_SOCKET) //vérification de "validité" du socket
{ // Fonctions à éxécuter sur le socket.
Label1->Caption="reçu";
}
}
closesocket(sock); //fermeture du socket
WSACleanup(); //nettoyage WSA
}
J'ai fait du pas a pas pour voir lors de la commande connect() une bonne 10en de secondes s'écoule avant de passer a la ligne suivante, idem pour la commande accept().
alors je ne sais pas trop se que j'ai mal fait et je ne sais pas trop vers qui me tourner.
J'espére avoir clairement exposer mon probléme et je vous remerci de prendre quelques instants pour lire ceci et peut étre y répondre.
Cordialement
Charléne
Partager