Client UDP

Résolu
doufdouf51 Messages postés 5 Date d'inscription vendredi 2 janvier 2009 Statut Membre Dernière intervention 7 juin 2010 - 2 juin 2010 à 16:58
doufdouf51 Messages postés 5 Date d'inscription vendredi 2 janvier 2009 Statut Membre Dernière intervention 7 juin 2010 - 7 juin 2010 à 11:24
J'ai un probleme avec la fonction recvfrom()
J'ai une application une en C# et dll en C++ qui communique en UDP.
Les deux programme peuvent envoyer des requêtes a l'autre.
Du coté serveur en C++ l'application fonctionne corectement donc coté client C# pas de souci.
Pas contre lorsque que j'envoie une requête a partie de la dll elle s'envoi correctement je la recois bien dans mon application C#, celle ci renvoi un accuser et mon application bug sur la fonction recvfrom().Je vous met mon code:


int n;
char buffer[1007];
struct hostent *hostinfo = NULL;
SOCKADDR_IN Info_destination = { 0 };
const char *hostname = "127.0.0.1"; //IP du serveur
int tosize = sizeof Info_destination;

hostinfo = gethostbyname(hostname);
if (hostinfo == NULL)
{
Debug.Log(1,"Probléme hostinfo");
exit(EXIT_FAILURE);
}

Info_destination.sin_addr = *(IN_ADDR *) hostinfo->h_addr; //IN_ADDR->Ecoute sur toutes les IP locales
Info_destination.sin_port = htons(8444);
Info_destination.sin_family = AF_INET;

MESSAGE_IHMPIPE_CMD message_DllIHM;

message_DllIHM.action = DLLIHM_ACT_D_NEWCONNECT;
message_DllIHM.ID_IHM = 0xA4;
message_DllIHM.STXIHM = 0xBE;
message_DllIHM.Arg[0] = DLLIHM_ACT_D_NEWCONNECT;
message_DllIHM.Arg[1] = ';';
message_DllIHM.Arg[2] = 0x09;
message_DllIHM.NbOctetArg =3;
message_DllIHM.BCC = BCC_Pipe((unsigned char*)&message_DllIHM,4+1+message_DllIHM.NbOctetArg);

Debug.Log(0,"Debut Envoi Trame");
if(sendto(sock_client,(const char*) &message_DllIHM, sizeof(message_DllIHM), 0, (SOCKADDR *)&Info_destination, tosize) < 0)

{
Debug.Log(1,"Erreur sendto");
}
Debug.Log(0,"Debut Attente Trame");
bool flag = true;
while(flag)
{
Debug.Log(0,"While");//Permet de tester
n = recvfrom(sock_client, buffer, sizeof buffer - 1, 0, (SOCKADDR *)&Info_destination, &tosize);

Debug.Log(0,"n %d",n);
Debug.Log(2,"recvfrom = %d",WSAGetLastError());

if (n == SOCKET_ERROR)
{
Debug.Log(2,"Get_Trame: SOCKET_ERROR");
flag = false;
//return false;
}

if (n 0)flag true;

if (n>0)
{
flag = false;
buffer[n] = '\0';
Debug.Log(0,"*************Debut Trame reponse IHM***************");
Debug.Log(0,"buffer[0] = %d",buffer[0]);
Debug.Log(0,"buffer[1] = %d",buffer[1]);
Debug.Log(0,"buffer[2] = %d",buffer[2]);
Debug.Log(0,"buffer[3] = %d",buffer[3]);
Debug.Log(0,"buffer[4] = %d",buffer[4]);
Debug.Log(0,"buffer[5] = %d",buffer[5]);
Debug.Log(0,"buffer[6] = %d",buffer[6]);
Debug.Log(0,"buffer[7] = %d",buffer[7]);
Debug.Log(0,"buffer[8] = %d",buffer[8]);
Debug.Log(0,"buffer[9] = %d",buffer[9]);
Debug.Log(0,"*************Fin Trame reponse IHM***************");
}
}

une fois que mon code arrive a la fonction recvfrom elle ne passe pas a l'instruction suivante.(dans mon fichier DEBUG je trouve le premier While puis plus rien. Je suis sur que cela ne vient pas de mon fichier DEBUG car quand je quitte la dll je retrouve bien a la suite les commande de fermeture.

Je ne vois pas du tout d'où cela peut venir :(
Si quelle qu'un a une idée je suis ouvert.
Si vous avez besoin de plus d'informations dit le moi !

2 réponses

katerson Messages postés 47 Date d'inscription jeudi 27 avril 2006 Statut Membre Dernière intervention 24 juin 2011
7 juin 2010 à 10:06
Salut!

"Pas contre lorsque que j'envoie une requête a partie de la dll elle s'envoi correctement je la recois bien dans mon application C#, celle ci renvoi un accuser et mon application bug sur la fonction recvfrom()"

Je ne crois pas avoir tout saisi mais la fonction recvfrom() est une fonction bloquante >> tant que le message n'est pas reçu tu ne sortiras pas de cette fonction...

As-tu fait du pas à pas pour voir ce qui se passe? Ta socket est peut être mal initialisé d'un des 2 côtés et tu ne reçois rien.

Mode Debug et affiche le contenu des buffers..
3
doufdouf51 Messages postés 5 Date d'inscription vendredi 2 janvier 2009 Statut Membre Dernière intervention 7 juin 2010
7 juin 2010 à 11:24
je ne peut pas utiliser le mode Debug(Je crois...) car le problème vient de la fonction recvfrom() de ma dll!! c'est pour cette raison que j'utilise un fichier texte qui me sert de Debug (je vais revérifier les initialisation des sockets)je te tien au courant
0
Rejoignez-nous