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 :

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;
}
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
 
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();
		}
 
	}
}
Le client ne me renvoie aucune erreur.

Voici le log du serveur :

created socket on port 15000
now listening
erreur lors de la lecture
errno : 10057
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 () 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.