Votre question

Probleme de socketn (recv) bloqué

Tags :
  • Serveur
  • Programmation
Dernière réponse : dans Programmation
6 Mai 2009 16:31:06

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

Autres pages sur : probleme socketn recv bloqua

a b L Programmation
6 Mai 2009 22:03:05

Le accept() avant ton recv se passe bien ? il retourne quelle valeur ?
7 Mai 2009 11:18:12

CRicky a dit :
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
Contenus similaires
a b L Programmation
7 Mai 2009 22:21:39

Et le netstat -a montrent bien les 2 ports du serveur et celui du client en écoute et établies ?
9 Mai 2009 13:08:17

CRicky a dit :
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.
a b L Programmation
9 Mai 2009 13:52:35

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é ?
9 Mai 2009 18:27:11

CRicky a dit :
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

a b L Programmation
9 Mai 2009 19:15:22

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.
10 Mai 2009 22:06:46

CRicky a dit :
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.
a b L Programmation
11 Mai 2009 21:25:25

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.
12 Mai 2009 13:05:08

CRicky a dit :
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
13 Mai 2009 13:10:28

CRicky a dit :
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
a b L Programmation
13 Mai 2009 20:42:07

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.
13 Mai 2009 23:33:18

CRicky a dit :
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
a b L Programmation
14 Mai 2009 20:15:45

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.
15 Mai 2009 11:12:27

CRicky a dit :
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.
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS