Bonjour !
Voici la structure:
- Serveur 1, ecoute sur 5001
- Serveur 2, ecoute sur 5002 et se connecte a 5001 pour papoter avec le serveur 1
- Client(s), se connecte a 5001.
Les serveurs arrivent a parler entre eux, aucun probleme.
En revanche, lorsque le client envoie des données (oui le send marche bien), he bien du coté du server, il ne recoit pas et me renvoie 10035 :/
Voici la réception du 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
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 while(!shutdown) { LockSharedMutex(); if(Collection->Count() == 0) // On ne fait rien si il ny a aucun client de connecté { UnlockSharedMutex(); continue; } if(Selectr->Select() < 0) // Si la fonction select() retourne -1.. { int e = WSAGetLastError(); if (e != 0) { std::cout << "WSA Error: " << e << std::endl; UnlockSharedMutex(); //continue; exit(0); } UnlockSharedMutex(); continue; } for(auto itr = Collection->AllSessions().begin(); itr != Collection->AllSessions().end(); ++itr) // boucle sur tout les clients connectés { Target = itr->second; if(Selectr->Ready(Target->GetSocket())) // alias de la fonction FD_SET(sock,&fs) { if(!ReceiveHeader(Target->GetSocket())) // recv() { if(BytesReceived < 0) { if(ErrorNumber == 10035) { //continue; } else { Selectr->Delete(Target); continue; } } else { Selectr->Delete(Target); continue; } } else { plength = (static_cast<int>((((Packet::htos(Header[0], 4) | Packet::htos(Header[1], 0)) & 0xff) << 8) & 0xffff | ((Packet::htos(Header[3], 4) | Packet::htos(Header[4], 0)) & 0xff)))+1; if(plength > 1) { if(!Receive(Target->GetSocket(), plength)) // recv() { if(BytesReceived < 0) { if(ErrorNumber == 10035) { continue; } else { std::cout << "Error reading packet " << ErrorNumber << std::endl; Selectr->Delete(Target); continue; } } else { Selectr->Delete(Target); continue; } } else { std::cout << "received::" << Buffer << std::endl; Target->handleRequest(Buffer); continue; } } else { Selectr->Delete(Target); continue; } } } } Selectr->Flush(); UnlockSharedMutex(); }
Voici le client que le serveur 2 possède:
Voici le socket du 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 ClientSocket::ClientSocket(const string& ip, int port) { csi.ip = ip; csi.port = port; if ((csi.sock = socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET) { exit(EXIT_FAILURE); } csi.sain.sin_family=AF_INET; //cout << "## Initializing the client socket" << endl; csi.sain.sin_addr.s_addr=inet_addr(csi.ip.c_str()); csi.sain.sin_port=htons(csi.port); if(connect(csi.sock,(struct sockaddr*)&csi.sain,sizeof(csi.sain)) != 0) { cout << "ERROR: Could not connect to " << csi.ip << ":" << csi.port << endl; exit(0); } csi.connected = true; }
Et j'appelle donc de cette facon:
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 ClientSocket::ClientSocket(const int proto) { #if defined (WIN32) WSADATA WSAData; int error = WSAStartup(MAKEWORD(2,2), &WSAData); #else int error = 0; #endif int sock_err; if(error) { std::cout << "ERROR: Starting up socket" << std::endl; exit(0); } csi.proto = protocol; csi.connected = false; csi.sock = 0; if ((csi.sock = socket(AF_INET, csi.proto, 0)) == INVALID_SOCKET) { exit(EXIT_FAILURE); } } bool ClientSocket::Connect(const std::string& ip, const int port) { if(csi.connected) // re-connection { Disconnect(); delete selector; selector = NULL; delete handler; handler = NULL; } selector = new Selector(); // alias pour les fonctions select, & FD* handler = new PacketHandler(this); // pas important csi.ip = ip; csi.port = port; if ((csi.sock = socket(AF_INET, csi.proto, 0)) == INVALID_SOCKET) { std::cout << "Could not create socket" << std::endl; return false; } csi.sain.sin_family = AF_INET; csi.sain.sin_addr.s_addr = inet_addr(csi.ip.c_str()); csi.sain.sin_port = htons(csi.port); if(connect(csi.sock, (struct sockaddr*)&csi.sain,sizeof(csi.sain)) != 0) { std::cout << "Could not connect to server" << std::endl; return false; } csi.connected = true; selector->Add(csi.sock); // on ajoute le socket au selecteur de fichier pthread_create(&t_networker, NULL, Networker, this); // le thread de reception return true; }
La connexion est bonne, la deconnexion egalement (cote serveur ou client, elle est bien gerée)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ClientSocket* a = new ClientSocket(SOCK_STREAM); a->Connect("127.0.0.1", 5001);
en revanche, le serveur donc, bah. Erreur 10035 quand jenvoie des données .... :/
Quelqu'un a - t - il une idée?
Partager