Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[winsock] recvfrom()

11 réponses
Avatar
JKB
Bonjour à tous,

J'ai un petit problème avec Visual C++ (2010) et une socket.
Je viens d'écrire un bout de code qui récupère un flux UDP d'une
caméra et qui le retransmet sur plusieurs réseaux en multicast
(toujours en UDP). Ce programme fonctionne bien, à l'aide d'un
analyseur de trame, je vois passer mes paquets UDP correctement
formatés.

Je viens de m'attaquer au client. Ce client doit donc se connecter à
une socket UDP et joindre un groupe multicast. Lorsque je fais
tourner le programme compilé en debug, ça fonctionne parfaitement.
En release, la fonction recvfrom() échoue sur un timeout et je ne
comprends pas du tout ce qui se passe. La chose est compilée en 32
bits sur un Windows 7 Ultimate 64 bits avec Visual Studio 2010
professionnel.

Le port utilisé est le port UDP/34 (imposé) et ne doit pas tourner
en administrateur. 34 est inférieur à 1024, mais si c'était ça le
problème, il devrait aussi se poser en debug.

Mon code est le suivant (il figure dans une fonction privée d'une
classe) :

void xxx::initSocket()
{
char datagram[DATAGRAM_SIZE];
char flag;

int address_length;
int ios;
int timeout;

struct sockaddr_in address;
struct sockaddr_in packet_address;

struct ip_mreq mreq;

// Try to open multicast socket

if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
{
return;
}

// Listening from all IPv4 addresses
// TODO : port is 34 for first camera, 35 for second one... und so
// weiter !

address.sin_family = AF_INET;
address.sin_port = multicastAddress.sin_port + 0; // FIX ME !
address.sin_addr.s_addr = htonl(INADDR_ANY);

flag = -1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag));

if ((bind(sock, (struct sockaddr *) &address, sizeof(address)))
!= 0)
{
close(sock);
return;
}

// Join multicast group

mreq.imr_multiaddr.s_addr = multicastAddress.sin_addr.s_addr;
mreq.imr_interface.s_addr = htonl(INADDR_ANY);

if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &mreq,
sizeof(mreq)) < 0)
{
return;
}

// Wait for a packet to discover image size.

srand(time(NULL));
address_length = sizeof(packet_address);

timeout = 1000;
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *) &timeout,
sizeof(timeout));

while((ios = recvfrom(sock, datagram, DATAGRAM_SIZE, 0,
(struct sockaddr *) &packet_address, &address_length)) ==
SOCKET_ERROR)
{

// Ici, recvfrom() échoue sur un timeout alors que les trames
// sont bien envoyées. Le port est UDP/34 et le programme ne tourne pas
// en administrateur.

Sleep((((double) rand()) / RAND_MAX) * 1000);
}

// .....

return;
}

Je suis convaincu que mon problème n'est pas un problème de réseau.
Si c'était le cas, cela ne fonctionnerait pas en debug.
Ou il se situe entre la chaise et le clavier ou il s'agit d'un
problème microsoftien, mais il a forcément une explication
rationnelle et peut-être certains d'entre vous ont déjà observé le
même genre de dysfonctionnement.

Si quelqu'un n'avait qu'un début d'explication, je lui serai
reconnaissant de bien vouloir éclairer ma lanterne.

Cordialement,

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr

1 réponse

1 2
Avatar
JKB
Le 13 May 2011 09:49:28 GMT,
Thierry écrivait :
JKB écrivait
news::

Bonjour à tous,

J'ai un petit problème avec Visual C++ (2010) et une socket.
Je viens d'écrire un bout de code qui récupère un flux UDP
d'une caméra et qui le retransmet sur plusieurs réseaux en
multicast (toujours en UDP). Ce programme fonctionne bien, à
l'aide d'un analyseur de trame, je vois passer mes paquets UDP
correctement formatés.



Les 2 (cleint et serveurà) sont linkés avec la même lib ??
De mémoire il y plusieurs lib dispo (ws32, ws32_2) qui implementent de
mêmes fonctions mais dont le comportement peut varier suivant la lib
utilisé.



Oui. Mais entre temps, j'ai trouvé que le problème venait de W7 et
je susi passé à autre chose.

/bin/bash: q : commande introuvable

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
1 2