| juju_le_barbare |
bonjour,
j'essaye de m'initier aux socket (sous win).
Donc en fait ce que j'ai fait c'est 2 fonctions,
* une qui s'appelle client();, qui créé un socket puis qui l'utilise en tant que client.
* une qui s'appelle server();, qui créé un socket puis qui l'utilise en tant que server.
voici le code que ça donne :
Code :
- #include <winsock2.h>
- #pragma comment(lib, "ws2_32.lib" )
- #include <string.h>
- #include <stdio.h>
- #include <fcntl.h>
- #include <io.h>
- void server(int port)
- {
- WSADATA WSAData;
- WSAStartup(MAKEWORD(2,0), &WSAData);
- char *buff = new char[255];
- int sizeofsin;
- SOCKET val;
- SOCKADDR_IN sin;
- sin.sin_addr.s_addr = inet_addr("127.0.0.1" );
- sin.sin_family = AF_INET;
- sin.sin_port = htons(port);
- SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- bind(sock, (SOCKADDR *)&sin, sizeof(sin));
- int fich = open("c:\\test.ini", O_RDWR | O_TEXT); //Ouvre le fichier (charge en mémoire)
- lseek(fich, 0L, SEEK_SET); //Positionne le pointeur au début du fichier (SEEK_SET)
- listen(sock, 0);
- while(true)
- {
- sizeofsin = sizeof(sin);
- val = accept(sock, (SOCKADDR *)&sin, &sizeofsin);
- if(val != INVALID_SOCKET)
- {
- //je réceptionne dans 'buff' ce qui arrive dans mon port 80
- recv(sock, buff, sizeof(buff), 0);
- write(fich, buff, strlen(buff));
- }
- }
- close(fich); //Ferme le fichier
- closesocket(sock);
- WSACleanup();
- }
- //------------------------------------------------
- ---------------------------
- void client(char *server, int port, char *msg, int lngmsg)
- {
- WSADATA WSAData;
- WSAStartup(MAKEWORD(2,0), &WSAData);
- SOCKADDR_IN sin;
- sin.sin_addr.s_addr = inet_addr(server);
- sin.sin_family = AF_INET;
- sin.sin_port = htons(port);
- SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- bind(sock, (SOCKADDR *)&sin, sizeof(sin));
- connect(sock, (SOCKADDR *)&sin, sizeof(sin));
- //j'envoie 'msg' sur le port 'port' de la machine 'server'
- send(sock, msg, lngmsg, 0);
- //
- closesocket(sock);
- WSACleanup();
- }
|
ensuite à partir de la fonction main(); j'appelle la fonction client(); ou server(); en passant les paramètres, l'IP et le
port de destination pour client, et juste le port d'écoute pour server();
Pour faire mes tests je lance netstat en ligne de commande.
Le client marche très bien, un server que j'ai pas codé reçoit les données envoyées...
Au fait question subsidiaire, comment choisir le port local pour l'envoi, actuellement c'est un port au hasard je crois.
Par contre le serveur marche pas, en le debuggant, il repete sans fin ce code :
while(true)
{
sizeofsin = sizeof(sin);
if((val = accept(sock, (SOCKADDR *)&sin, &sizeofsin)) != INVALID_SOCKET)
Donc il considère toujours val comme un INVALID_SOCKET ...
A moins qu'il faille que ça valle INVALID_SOCKET pour que ça marche, non ?
Encore une question, comment faire une 3eme fonction, par exemple open_sock(); appelée par server(); ou client(); qui créé le socket ?
Quels paramètres et quelles valeur de retour je dois mettre ?
Merci de votre aide !
@++ :hello: |