Bonjour !
J'ai cherché longuement sur le net pour trouver une solution à mon problème et aucune ne semble fonctionner...
Je cherche à faire une sorte de forwarder "simple" d'une ip/port vers une autre...
Le programme se lance et attend la connexion d'un client.
Une fois le client connecté, le programme ouvre un autre socket vers un server.
ensuite il forward les données envoyées par le server au client et inversement.
Mon premier problème a été rencontré avec le "recv" bloquant. J'ai donc cherché comment le rendre non bloquant... J'ai trouvé alors "FIONBIO" et la ça semblait marcher dans un premier temps mais après cela recv retournait "-1" tout le temps même si recv avait effectivement lu les données...
Cela a eu pour effet de planter toute la gestion des erreur et par dessu le marcher de faire augmenter la charge CPU jusqu'à 50% pour ce process seul !
J'ai donc abandonné les sockets non bloquants et me suis penché sur "select".
J'ai donc procédé comme suit (code nettoyé des traitements) :
les fonctions CreateServerSocket() et CreatClientSocket() sont logue et pas interessantes, elles retourenes les socket "paramétrés"
Le problème est que mes tests "FD_ISSET()" retournent toujour 1 ! Donc je reste toujours bloqué sur les recv...
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 SOCKET ServerSock = CreateServerSocket(2654); SOCKET ClientSock = CreateClientSocket(6667); fd_set ServerReadfds; fd_set ClientReadfds; FD_ZERO(&ServerReadfds); FD_SET(ClientSock, &ServerReadfds); FD_ZERO(&ClientReadfds); FD_SET(ServerSock, &ClientReadfds); int ret; do { select(ClientSock+1, &ServerReadfds, NULL, NULL, NULL); if(ret = FD_ISSET(ClientSock, &ServerReadfds)) { printf("New incomming datum from Server ! (%d)\n",ret); //ici je traite le recv du 1er socket.... } select(ServerSock+1, &ClientReadfds, NULL, NULL, NULL); if(ret = FD_ISSET(ServerSock, &ClientReadfds)) { printf("New incomming datum from Client ! (%d)\n",ret); //ici je traite le recv du 2e socket.... } } while(1)
Merci pour votre aide !
Partager