Probleme de socketn (recv) bloqué
Forum Programmation : Probleme de socketn (recv) bloqué
salut,
mon probleme est le suivant :
je veut faire un tunnel vpn entre deux pc (client et serveur) en programmation en language c sous windows;
je dispose au depart de deux cartes reseaux virtuels une est installé coté client et l'autre coté serveur
les deux sont nommées "TAP01" les instructions à réaliser est les suivantes:
1- ouvrir une socket de connexion entre le client et le serveur en mode connecté
2-coté client:
2.1-lire les données du TAP01 (ReadFile)
2.2-envoyer ces données via la socket vers le serveur (send)
2.3-recevoir les données venant du serveur via sa socket (recv)
2.4-ecrire les données reçus sur le TAP01 (WriteFile)
tous ces instructions sont dans un boucle while
while (1) {
//*************************lecture*************************
if(ReadFile(hTap, Buf, sizeof(Buf), &dwLen, &ovl))
{
//**************** send ***************************
nombre_de_caractere=send(id_de_la_socket,Buf,dwLen,0);
}
// Reception des données
// ********************************************************
nombre_de_caractere=recv(id_de_la_socket,Buf,sizeof(Buf),0);
if (nombre_de_caractere==SOCKET_ERROR)
printf("\nDesole, je n'ai pas recu de donnee" );
else
{
//*****************************ecriture*************************************
WriteFile(hTap, Buf,nombre_de_caractere, &dwLen, &ovl)
}
}//fin while
3-coté serveur:
3.1-recevoir les données venant du client via sa socket (recv)
3.2-ecrire les données reçus sur son TAP01 (WriteFile)
3.3lire les données du son TAP01 (ReadFile)
3.4-envoyer les données lus via sa socket vers le client (send)
de meme ces instructions sont dans un boucle while
while (1) {
// Reception des données
// ********************************************************
nombre_de_caractere=recv(id_de_la_socket,Buf,sizeof(Buf),0);
if (nombre_de_caractere==SOCKET_ERROR)
printf("\nDesole, je n'ai pas recu de donnee" );
else
{
//*****************************ecriture*************************************
WriteFile(hTap, Buf,nombre_de_caractere, &dwLen, &ovl)
}
//*************************lecture*************************
if(ReadFile(hTap, Buf, sizeof(Buf), &dwLen, &ovl))
{
//**************** send ***************************
nombre_de_caractere=send(id_de_la_socket,Buf,dwLen,0);
}
}//fin while
tous marche bien sans erreur lors du test le ping du client vers le serveur marche bien
mais dans l'autre sens (serveur vers client)ne marche pas sauf lorsque je ping coté client et simultanement coté serveur.
j'arrive à constater que le probleme est que le recv du serveur est bloqué.
j'ai essayé avec les socket non bloquante mais cela ne resoud pas le probleme (probleme de synchronization)
je n'arrive pas à resoudre ce probleme qui m'ennuie
je serais heureuse si quelqu'un peut m'aider
Message édité par ing2009 le 06-05-2009 à 18:28:30
Le accept() avant ton recv se passe bien ? il retourne quelle valeur ?
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
| CRicky a écrit : Le accept() avant ton recv se passe bien ? il retourne quelle valeur ? |
merci d'etre interessé à mon sujet voila la partie du code pour le accept ainsi que le recv
id_de_la_nouvelle_socket=accept(id_de_la_socket,(struct sockaddr*)&information_sur_la_source,&tempo);
if(id_de_la_nouvelle_socket==INVALID_SOCKET)
printf("\nDesole, je ne peux pas accepter la session TCP du a l'erreur : %d",WSAGetLastError());
else
printf("\naccept : OK" );
//-----------lecture tap----------------------------
while (1){
// Reception des données
// ********************************************************
nombre_de_caractere=recv(id_de_la_nouvelle_socket,Buf,sizeof(Buf),0);
//*************instructions
Et le netstat -a montrent bien les 2 ports du serveur et celui du client en écoute et établies ?
Message édité par CRicky le 07-05-2009 à 22:21:57
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
| CRicky a écrit : Et le netstat -a montrent bien les 2 ports du serveur et celui du client en écoute et établies ? |
j'ais vérifié et je trouve que les 2 ports sont bien établies et en écoute.
Le recv est bloquant c'est normal, mais je pense que tu n'envoies rien au serveur. Tu passes bien dans le send de l'autre coté ?
Message édité par CRicky le 09-05-2009 à 13:52:41
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
| CRicky a écrit : Le recv est bloquant c'est normal, mais je pense que tu n'envoies rien au serveur. Tu passes bien dans le send de l'autre coté ? |
j'ai essayé d'envoyer un buffer initialisé au debut de chaque etiration mais cela ne marche pas par contre lors du test le ping ne marche pas dans les deux sens voila que j'essayer de le faire coté client (j'ais rien modifier coté serveur)
[code]
UCHAR Buf[BUFMAX] ={0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xA6, 0x94, 0x23, 0x7B, 0x08, 0x06, 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x01, 0x00, 0xFF, 0xA6, 0x94, 0x23, 0x7B, 0x64, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x01,};
while (1) {
nombre_de_caractere=send(id_de_la_socket,Buf,sizeof(Buf),0);
//*************************lecture*************************
if(ReadFile(hTap, Buf, sizeof(Buf), &dwLen, &ovl))
{
//**************** send ***************************
nombre_de_caractere=send(id_de_la_socket,Buf,dwLen,0);
}
// Reception des données
// ********************************************************
nombre_de_caractere=recv(id_de_la_socket,Buf,sizeof(Buf),0);
if (nombre_de_caractere==SOCKET_ERROR)
printf("\nDesole, je n'ai pas recu de donnee" );
else
{
//*****************************ecriture*************************************
WriteFile(hTap, Buf,nombre_de_caractere, &dwLen, &ovl)
}
}//fin while
Et tu as testé sur la même machine ?
Le ping doit fonctionner dans les sens. Si ce n'est pas le cas, c'est qu'il y a un problème de configuration matérielle sur une des 2 machines.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
| CRicky a écrit : Et tu as testé sur la même machine ?
|
tout d'abord merci pour votre cher temps que vous passez pour lire et répondre
concernant le test j'ai tester avec deux machines (Windows XP)virtuelles (en utilisant Virtuel PC) installées sur le même pc réelle.mais a propos la configuration je suis sur quelle est juste :les deux cartes réseaux physiques des 2 machines sont en local only avec deux adresses dans le même netmask ainsi que les deux taps encore sont dans le même plage d'adresse.
Message édité par ing2009 le 10-05-2009 à 22:08:02
Oui, mais un jour, j'ai eu le coup du ping qui fonctionnait dans un seul sens entre 2 PC sous linux, et c'était dû à un problème de configuration de routage.
Tu n'es pas obligé de lancer 2 systèmes d'exploitation, tu peux lancer 1 serveur et autant de clients que tu veux (enfin beaucoup) dans le même.
Bref, j'ai pas d'autres idées. Moi, je testerais en debug, et au pire en espionnant le réseau.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
| CRicky a écrit : Oui, mais un jour, j'ai eu le coup du ping qui fonctionnait dans un seul sens entre 2 PC sous linux, et c'était dû à un problème de configuration de routage.
|
juste je veut vous envoyer un grand merci pour votre temps et vos reponces et inchallah lorsque je trouve la solution je veus vous dire
| CRicky a écrit : Oui, mais un jour, j'ai eu le coup du ping qui fonctionnait dans un seul sens entre 2 PC sous linux, et c'était dû à un problème de configuration de routage.
|
salut,
A propos mon probleme est ce que je peut la resoudre en creant deux threads l'un déstiné pour le ReadFile et le send et l'autre déstiné pour la recv et le WriteFile ces deux threads partages la même socket et la même tap.est ce que c'est fesable ou non, sinon comment je doit les gestionnées(les threads)?
merci d'avance
Oui, côté serveur, tu peux faire un thread d'écoute, et autant de threads que de clients connectés. Côté client, normalement, tu ne devrais pas en avoir besoin, car généralement, tu attend toujours une réponse à un send et pas plus.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
| CRicky a écrit : Oui, côté serveur, tu peux faire un thread d'écoute, et autant de threads que de clients connectés. Côté client, normalement, tu ne devrais pas en avoir besoin, car généralement, tu attend toujours une réponse à un send et pas plus. |
non c'est pas ça que je veut le faire pour le meme client et le serveur je fait 2 thread un pour {ReadFile,send} et l'autre pour{recv,WriteFile} je les tester mais ils s'exécutent les deut en parallèle mais après un certain temps le programme provoque une erreur parfoie de lecture du tap et parfoie d'eriture sur le tap donc je doit synchronizer les deux threads lorsque l'un est active l'autre est inactive mais je sais pas comment faire
OK, il faut utiliser un mutex ou une sémaphore pour verrouiller les accès afin d'éviter de lire une moitié avant mise à jour et une moitié après.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
| CRicky a écrit : OK, il faut utiliser un mutex ou une sémaphore pour verrouiller les accès afin d'éviter de lire une moitié avant mise à jour et une moitié après. |
salut,
et enfin j'ai reussi à résoudre mon probleme en utilisant les threads synchronisés je crées deux les deux threads et je les joignes en utilisant pthread_join et un boucle while de plus.
mercci pour tout votre temps.
Il y a 1882 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

CRicky