Salut,
Je m'ammuse en ce moment à faire un petit daemon pour les serveurs de ma boite, et je voudrais le faire en C++ histoire d'avoir un exécutable et pas être obligé d'avoir java qui tourne... Enfin bref.
J'ai suivi plusieurs tutoriels et pioché à droite à gauche pour faire un serveur en C++ qui écoute sur une socket sur le port 15000.
Il attend bien la connexion, "logs à l'appui" (en supposant que ca plante si ca fonctionne pas).
Bon, sans plus attendre, le code de la bête :
et mon client en java qui se connecte, envoie SHUTDOWN et se déconnecte :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 #include <cstdlib> #include <iostream> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") using namespace std; int main(int argc, char *argv[]) { WSADATA WSAData; WSAStartup(MAKEWORD(2,0), &WSAData); SOCKET sock; SOCKADDR_IN sin; sin.sin_addr.s_addr = inet_addr("127.0.0.1"); sin.sin_family = AF_INET; sin.sin_port = htons(15000); sock = socket(AF_INET,SOCK_STREAM,0); bind(sock, (SOCKADDR *)&sin, sizeof(sin)); listen(sock, 0); int val = 0; int sizeSin = sizeof(sin); cout << "created socket on port 15000" << endl; cout << "now listening" << endl; while(1) { val = accept(sock, (SOCKADDR *)&sin, &sizeSin); if(val != INVALID_SOCKET) { char* buffer=new char[1024]; int retour = 0; retour = recv(sock,buffer,sizeof(buffer),0 ); if (retour == SOCKET_ERROR) { cout << "erreur lors de la lecture" << endl << "errno : " << WSAGetLastError() << endl; continue; } else { if(strcmp(buffer,"SHUTDOWN")==0) { cout << "SHUTDOWN RECEIVED"<<endl; } } } } cout << "ciyciy" << endl; cout << "test" << endl; system("PAUSE"); //return EXIT_SUCCESS; }
Le client ne me renvoie aucune erreur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 import java.net.*; public class TestDaemon { TestDaemon() { } public static void main(String[] args) { try { Socket s=new Socket("localhost",15000); s.getOutputStream().write("SHUTDOWN".getBytes(),0,8); s.getOutputStream().flush(); s.close(); } catch(Exception e) { e.printStackTrace(); } } }
Voici le log du serveur :
J'ai un peu cherché sur le net à propos de l'erreur 10057 mais j'ai soit rien compris soit rien trouvé d'interressant. Visiblement la socket est pas connectée et donc a refusé la connexion (created socket on port 15000
now listening
erreur lors de la lecture
errno : 10057) d'où mon incompréhension.
Alors ma question est : D'où que ca cloche ? C'est grave docteur ?
Autre chose, il semblerai que, puisque j'ai donné comme inet_address 127.0.0.1 à ma socket, elle n'accepte que les connexions de moi sur moi même, et pas de l'extérieur. Si je ne mets pas de inet_address, alors le socket n'accepte aucune connexion. Comment faire pour qu'il accepte la connexion de n'importe quelle ip ?
Merci d'avance
F.
Partager