Bonjour,

Je travail actuellement sur un projet de conversion de protocole UDP/MCast/Serie.
Pour la partie serie RS232 je verrais plus tard.

J'ai débuté mon projet avec une conversion Mcast->UDP Unicast. Sur mon ordinateur le résultat est conforme et tous les paquets reçus sont retransmis.
Le problème se complique lorsque que j'ai voulu déployer le programme sur un autre ordinateur.

Sur un autre ordinateur certain paquets sont perdus au delà d'environ 8000 caractères. sachant que les paquets arrivent par slave de 60 à 100 caractères. Apres plusieurs essais j'opterais pour un problème de gestion du buffer de la carte réseau qui ne se viderais pas assez vite à chaque lecture .
Je m'explique: le serveur envoi en Mcast environ 200 lignes de 60 caractères toutes les 10 secondes (200*60=12000). Mon programme reçois environ 8000 caractères toutes les 10 secondes (8000 sur les autres PC. Sur mon PC ou tourne le compilateur c++ tout les caractères sont reçu).
Autre point avec Wireshark TOUT les paquets sont reçu sur n'importe quel PC, il y a donc plus de paquets reçu sur un meme PC avec wireshark que le programme.

J'ai fais quelques essais, mais sans resultat. Je fais appel au forum Developpez, dans lequel, quelqu'un aurai peut etre rencontré un probleme de ce type

Le code:

Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
int main(int argc, char* argv[])
{
        WSAData data;
        WSAStartup( MAKEWORD( 2, 2 ), &data );
 
        SOCKET sockfd, sockfd2;
        int reuse;
        int n,i;
        int recvlen;
        char buf[BUFSIZE];
        struct sockaddr_in recvaddr, sendaddr;
 
        struct ip_mreq {
        struct in_addr imr_multiaddr;   /* IP multicast address of group */
        struct in_addr imr_sourceaddr;  /* IP address of source          */
        struct in_addr imr_interface;   /* local IP address of interface */
        };
 
        struct ip_mreq group, group2;
 
        printf("Test Mcast - Unicast\n");
 
        //Socket de reception MCast
        if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
                perror("Rx Socket fail\n");
	        exit(1);
        }
 
        //	Socket d'émission UDP
	if ((sockfd2 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
		perror("Tx Socket fail\n");
	        exit(1);
	}
 
 
        //Init socket in
        reuse = 1;
	setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *) &reuse, sizeof(reuse));
        setsockopt(sockfd2, SOL_SOCKET, SO_REUSEADDR, (char *) &reuse, sizeof(reuse));
 
	memset((char *)&recvaddr, 0, sizeof(recvaddr));
	recvaddr.sin_family = AF_INET;
	//recvaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        //recvaddr.sin_addr.s_addr = inet_addr("192.168.1.23");
        recvaddr.sin_addr.s_addr = inet_addr("172.16.1.1");
	recvaddr.sin_port = htons(62000);
 
	bind(sockfd,(struct sockaddr*)&recvaddr,sizeof(recvaddr));
 
	//group.imr_multiaddr.s_addr = inet_addr("239.192.0.5");
        group.imr_multiaddr.s_addr = inet_addr("239.101.5.1");
        //group.imr_sourceaddr.s_addr = inet_addr("192.168.1.23");
        group.imr_interface.s_addr = htonl(INADDR_ANY);
	setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &group, sizeof(group));
 
        //Init socket out
        memset((char *) &sendaddr, 0, sizeof(sendaddr));
        sendaddr.sin_family = AF_INET;
        sendaddr.sin_addr.s_addr = inet_addr("172.16.1.1");
        sendaddr.sin_port = htons(60005);
 
	//bind(sockfd2,(struct sockaddr*)&sendaddr,sizeof(sendaddr));
 
 
        group.imr_multiaddr.s_addr = inet_addr("239.192.0.5");
        group.imr_interface.s_addr = htonl(INADDR_ANY);
	setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &group, sizeof(group));
 
        while(1)
        {
                //sprintf(buf,"Hello\n");
                //sendto(sockfd2, buf, 6, 0, (struct sockaddr*) &sendaddr, sizeof(sendaddr));
                //printf("Hello\n");
                n = recvfrom(sockfd, buf, BUFSIZE, 0, (struct sockaddr *) &recvaddr, &recvlen);
                if (n>=1)
                {
 
                        if((sendto(sockfd2, buf, n, 0, (struct sockaddr*) &sendaddr, sizeof(sendaddr))) < 0)
                        {
                                perror("Error Send2 : \n");
                                exit(1);
                        }
 
 
                        buf[n] = 0;
                        //Affichage
			for (i=0; i<n; i++)
			{
				if (buf[i] == 0)
				buf[i] = 0x20;
			}
                        printf("Recu: %s\n", buf);
 
                }
        }
 
        return 0;
}

Merci