titouille | Bonjour !!!
Voilà... Je tente, cf un autre message sur ce même forum, de créer un mini serveur socket en C++ (via C++BuilderX), permettant de communiquer avec une animation Flash via l'objet XMLSocket.
Bon, je me suis documenté, et j'ai fini par aboutir à un résultat, mais qui n'est de loin pas encore satisfaisant. Pour le moment, le truc est simple. J'aurai besoin d'envoyer 2 requêtes au serveur. 1 commande, ainsi que la demande de fermeture du serveur (donc de l'exe)
Je suis arrivé à faire la création du socket, la création de la connexion et la réception/envoi d'un message avec réception du résultat dans l'animation Flash, mais ça ne fonctionne qu'une seule fois...
Dès que la connexion est établie, je peux faire une requête vers le serveur, puis le renvoi d'un résultat vers l'animation Flash, puis ensuite, les requêtes ne donnent plus rien...
Voici mon code... Si vous pouviez me donner quelques informations/conseils sur la manière de m'y prendre pour pouvoir faire plusieurs interactions, sur l'implémentation de mon serveur, je vous en serai gré ( et également me dire si ma manière de faire pour afficher des infos dans le buffer est correcte ou si il y a mieux à faire... j'imagine une surcharge d'opérateurs, mais c'est un peu trop lointain comme concepts pour moi... une url de rafraichissement serait la bienvenue )
D'avance merci
le code :
Code :
- #include <iostream.h>
- #include <winsock2.h>
- #pragma comment(lib, "ws2_32.lib" )
- #define MAXBUFLEN 100
- #define MYPORT 2027
- int main( int argc, char * argv[] )
- {
- WSADATA WSAData;
- if (WSAStartup(MAKEWORD(2, 0), &WSAData) != 0)
- {
- fprintf(stderr, "WSAStartup failed.\n" );
- exit(1);
- }
- SOCKET sock;
- SOCKET csock;
- SOCKADDR_IN sin;
- SOCKADDR_IN csin;
- int msgsize, sinsize, numbytes;
- char buff[MAXBUFLEN];
- sock = socket(AF_INET, SOCK_STREAM, 0);
- sin.sin_addr.s_addr = inet_addr("127.0.0.1" );
- sin.sin_family = AF_INET;
- sin.sin_port = htons(MYPORT);
- memset(&(sin.sin_zero), '\0', 8); // zero the rest of the struct
- if (bind(sock, (SOCKADDR *)&sin, sizeof(sin)) == -1)
- {
- fprintf(stderr, "Bind failed.\n" );
- exit(1);
- }
- if( listen(sock, 0) == -1 )
- {
- fprintf(stderr, "Listen on socket failed.\n" );
- exit(1);
- }
- char* message = "Hello world, yeyeye !\r\n";
- msgsize = strlen(message) + 1;
- while(1)
- {
- sinsize = sizeof(csin);
- if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) == -1 ) //INVALID_SOCKET)
- {
- fprintf( stderr, "accept connection" );
- continue;
- }
- fprintf( stderr, "server : got connection from %s\n", inet_ntoa( csin.sin_addr ) );
- if( numbytes=recv( csock, buff, MAXBUFLEN - 1, 0) <= 0 )
- {
- if( numbytes == 0 )
- // connection closed...
- fprintf( stderr, "connection closed...\n" );
- else
- perror( "recv" );
- }
- fprintf( stderr, buff );
- int bytes_sent = send(csock, message, msgsize, 0);
- }
- }
|
[edit]
encore une petite question... Est-ce que, à priori, l'exe résultant de ce code est capable de tourner sur winXP autant bien que sur win98 ou 95, ou bien devrais-je plutôt utiliser une version winsock plus ancienne pour garder une compatibilité sur les anciens OS windows ?
[/edit] Message édité par titouille le 11-07-2005 à 00:48:51
|