Tom's Guide > Forum > Programmation > Probleme de socketn (recv) bloqué

Probleme de socketn (recv) bloqué

Forum Programmation : Probleme de socketn (recv) bloqué

TomsGuide.com : 800 000 inscrits répondent à toutes vos questions high-tech et informatique. Pour obtenir de l'aide, inscrivez-vous gratuitement !
Mot :    Pseudo :           
 

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
Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

Le accept() avant ton recv se passe bien ? il retourne quelle valeur ?

------------------------------ 6800A007B81300CD10B00131C989CF26880541
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

Répondre à ing2009

Et le netstat -a montrent bien les 2 ports du serveur et celui du client en écoute et établies ?

Message cité 1 fois
Message édité par CRicky le 07-05-2009 à 22:21:57
------------------------------ 6800A007B81300CD10B00131C989CF26880541
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.

Répondre à ing2009

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 cité 1 fois
Message édité par CRicky le 09-05-2009 à 13:52:41
------------------------------ 6800A007B81300CD10B00131C989CF26880541
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

Répondre à ing2009

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.

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

CRicky a écrit :

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.


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
Répondre à ing2009

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.

------------------------------ 6800A007B81300CD10B00131C989CF26880541
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.
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.



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

Répondre à ing2009

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.
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.


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

Répondre à ing2009

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.

------------------------------ 6800A007B81300CD10B00131C989CF26880541
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

Répondre à ing2009

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.

------------------------------ 6800A007B81300CD10B00131C989CF26880541
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.

Répondre à ing2009
Tom's Guide > Forum > Programmation > Probleme de socketn (recv) bloqué
Aller à :

Il y a 1882 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens