Bonjour,

J'ai décidé il y a peu de créer deux classe pour faciliter l'utilisation des sockets.

L'une des classe permet de démarrer un socket en mode serveur, l'autre en mode client. Mais il semblerais que quand j'essaie de transmettre une donnée, le recv() ne fonctionne pas. J'ai essayé de trouver l'erreur par moi même, mais rien a faire, les données ne passent pas.

Voici les headers des classes :

Le client
--------

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
 
class client
{
private :
	bool starter_check;
	string buffer;
	int erreur;
	SOCKET sock;
	SOCKADDR_IN sin;
 
	#if defined (WIN32)
		WSADATA WSAData;
	#endif
public :
        // Creation de la socket
	client(int port, string ip_g);
	//destruction de la socket
	~client();
	// Envoie/reception des données
	bool getData();
	bool sendData();
	// getters/setters
        char *getBuffer();
        bool setBuffer(char *newbuffer);
};
le serveur
---------

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
 
class server
{
private :
        bool starter_check;
        string buffer;
        int erreur;
        SOCKET sock;
        SOCKADDR_IN sin;
        SOCKET csock;
        SOCKADDR_IN csin;
 
        #if defined (WIN32)
                WSADATA WSAData;
        #endif
 
public :
        // Creation de la socket
	server(int port);
        //destruction de la socket
	~server();
        // Envoie/reception des données
	bool getData();
	bool sendData();
        // getters/setters
        char* getBuffer();
        bool setBuffer(char *newbuffer);
};
et voici les 2 main.cpp (les données sont envoyées entre deux programmes)

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
 
    // LE PREMIER MAIN
    char *buffer = "un test";
    bool check;
    server *s = new server(23);
 
    check = s->setBuffer(buffer);
    check = s->sendData();
 
    delete s;
 
    return 0;
 
 
 
 
    // LE DEUXIEME MAIN
 
    bool check;
    server *c = new client(23, "127.0.0.1");
 
    check = c->getData();
    char *buffer = c->gerBuffer();
 
    cout << buffer << endl;
 
    delete c;
 
    return 0;

Je pense que l'erreur est peut-être due a la structure de mon code, mais il se peux que j'ai fais une faute lors de la création des sockets. C'est pour cela que je vais aussi mettre le cpp des classes :

server.cpp :
------------

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
 
#include "server.h"
server::server(int port)
{
	#if defined (WIN32)
		erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
	#else
		erreur = 0;
	#endif
 
	if(!erreur)
	{
		sock = socket(AF_INET, SOCK_STREAM, 0);
        if(sock != INVALID_SOCKET)
		{
			// Ouverture de la socket = ok 
 
			//configuration
			sin.sin_addr.s_addr = htonl(INADDR_ANY);
			sin.sin_family = AF_INET;
			sin.sin_port = htons(port);
 
            int ok = bind(sock, (SOCKADDR*)&sin, sizeof(sin));
 
			if(ok != SOCKET_ERROR)
			{
				ok = listen(sock, 5);
 
				if(ok != SOCKET_ERROR)
				{
                    int size = sizeof(csin);
                    csock = accept(sock, (SOCKADDR*)&csin, &size);
                    starter_check = true;
				}
				else
                    starter_check = false;
			}
			else
                starter_check = false;
		}
		else
            starter_check = false;
	}
	else
        starter_check = false;
 
}
server::~server()
{
               closesocket(csock);
               closesocket(sock);
               #if defined (WIN32)
                    WSACleanup();
               #endif
}
 
// -----------------------------------
// -----------------------------------
 
bool server::getData()
{
    // Verifie si le constructeur n'a pas planté
    vector<char> buffer_p(5000);
    if(starter_check == false)
    {
        return false;
    }
 
    int ok = recv(sock, buffer_p.data(), sizeof(buffer_p), 0);
 
    if(ok != SOCKET_ERROR)
    {
        buffer_p.resize(ok);
        buffer = buffer_p.data();
        return true;
    }
    else
        return false;
}
bool server::sendData()
{
        //Veriefie si le constructeur n'a pas planté
        if(starter_check == false)
        {
                return false;
        }
        // Ceci est une fonction qui converti les string en char*
        char *buffer_p = stringToChar(buffer);
 
        int ok = send(sock, buffer.c_str(), sizeof(buffer), 0);
 
        if(ok != SOCKET_ERROR)
        {
                return true;
        }
        else
            return false;
}
 
 
// ------------------------------
// ------------------------------
 
 
char* server::getBuffer()
{
    return stringToChar(buffer);
}
bool server::setBuffer(char *newbuffer)
{
    if(starter_check == false)
    {
            return false;
    }
    buffer = newbuffer;
    return true;
}
Client.cpp
----------

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
 
#include "client.h"
 
client::client(int port, string ip_g)
{
        #if defined (WIN32)
                erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
        #else
                erreur = 0;
        #endif
 
	if(!erreur)
	{
		// Creation de la socket
		sock = socket(AF_INET, SOCK_STREAM, 0);
 
		// Connection configuration
		sin.sin_addr.s_addr = inet_addr(ip_g.c_str());
		sin.sin_family = AF_INET;
		sin.sin_port = htons(port);
 
        // If connection
        if(connect(sock, (SOCKADDR*)&sin, sizeof(sin)) != SOCKET_ERROR)
		{
			starter_check = true;
		}
		else
            starter_check = false;
 
	}
	else
        starter_check = false;
}
 
 
client::~client()
{
            closesocket(sock);
 
            #if defined (WIN32)
                    WSACleanup();
            #endif
 
}
 
//  ********************
//  ********************
 
 
bool client::getData()
{
    // Verifie si le constructeur n'a pas planté
    vector<char> buffer_p(5000);
	if(starter_check == false)
	{
		return false;
	}
 
    int ok = recv(sock, buffer_p.data(), sizeof(buffer_p), 0);
 
	if(ok != SOCKET_ERROR)
	{
		buffer_p.resize(ok);
		buffer = buffer_p.data();
		return true;
	}
	else
		return false;
 
}
bool client::sendData()
{
        //Verifie si le client n'a pas planté
        if(starter_check == false)
        {
                return false;
        }
        char *buffer_p = stringToChar(buffer);
 
        int ok = send(sock, buffer.c_str(), sizeof(buffer), 0);
 
        if(ok != SOCKET_ERROR)
        {
                return true;
        }
        else
                return false;
}
 
 
// ------------------------------
// ------------------------------
 
 
char* client::getBuffer()
{
    return stringToChar(buffer);
}
bool client::setBuffer(char *newbuffer)
{
    if(starter_check == false)
    {
            return false;
    }
	buffer = newbuffer;
	return true;
}
Je sais que les deux dernier "codes" sont assez grands, mais je ne les ai que mis au cas ou.

Merci de votre aide .