Bonjour à tous,
Dans le cadre d'un projet je dois envoyé, via une socket, un "protocol request packet" en multicast à différent système, afin de pouvoir récupérer certaines informations de ces systèmes.
En simulant sur l'ordinateur: j'ai réussi tt d'abord à envoyer des simples char comme "hello, world" en multicast vers un "client", mais je n'arrive pas à envoyer des information plus complexe en struct, je vous montre mon programme:
Voici tt d'abord le main principal:
La fonction multiSocketSendto();
Code : 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 /* * workstation.c * * Created on: 3 août 2017 * Author: Aymeric */ #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <pthread.h> #include "unicastSocketRcvfrom.h" #include "multiSocketSendto.h" #include "request.h" #define PORT1 12345 #define PORT2 7 #define GROUP_IP "225.0.0.37" #define ADDRIP "127.0.0.1" /*Returns 0 if OK, a negative value if EOF.*/ scanf("\n\n%s", &request[2]); return request[2]; }*/ int fpurge(FILE *f) { int c; while((c=fgetc(f))!=EOF && c!='\n') { } return (c==EOF ? -1 : 0); } void *send_multi(void *arg){ struct IPRequest *rq = {0}; rq->unicast_ip=10000010; rq->unicast_port = 7; rq->protocol_identifier=00; while(1) { printf("Push a letter S or Q:\r\n"); char c = getchar(); fpurge(stdin); if ((c=='s')||(c=='S')) { multiSocketSend(PORT1, GROUP_IP, rq); } else if ((c=='q')||(c=='Q')) { printf("QUIT"); break; } else { printf("Invalid key, tape 'S' to send a message, 'Q' to exit."); } } pthread_exit(NULL); /* Fin du thread */ return NULL; } int main(void) { /* this variable is our reference to the second thread */ pthread_t threadSendmulti; /* create a second thread which executes send_uni(void *arg) */ if(pthread_create(&threadSendmulti, NULL, send_multi, NULL)) { fprintf(stderr, "Error creating threadSendmulti\n"); return 1; } /* wait for the second thread to finish */ if(pthread_join(threadSendmulti, NULL)) { fprintf(stderr, "Error joining threadSendmulti\n"); return 2; } return 0; }
Code : 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 #include "multiSocketSendto.h" int multiSocketSend (int PORT,char *GROUP_IP, struct IPRequest *request){ struct sockaddr_in addr; int msock; WSADATA WSAData; // Contains details of the Winsock implementation // Initialize Winsock. if (WSAStartup (MAKEWORD(1,1), &WSAData) != 0) { printf("Error n°%d : Error during initialization.\n", SOCKET_ERRNO); //exit(SOCKET_ERRNO); return SOCKET_ERRNO; } //create what looks like an ordinary UDP socket if ((msock=socket(AF_INET,SOCK_DGRAM,0)) < 0) { printf("Error n%d : Unable to initialize socket.\n",SOCKET_ERRNO); //exit(SOCKET_ERRNO); return SOCKET_ERRNO; } //set up destination address memset(&addr,0,sizeof(addr)); addr.sin_family=AF_INET; addr.sin_addr.s_addr=inet_addr(GROUP_IP); addr.sin_port=htons(PORT); //now just sendto() our destination! if (sendto(msock,&request,sizeof(struct IPRequest),0,(struct sockaddr *) &addr, sizeof(addr)) < 0) { printf("Error n%d : Unable to send message.\n",SOCKET_ERRNO); //exit(SOCKET_ERRNO); return SOCKET_ERRNO; } printf("Sending successfully!\n"); WSACleanup(); return 0; }
et le header de la requete (request.h)
Code : 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 #ifndef REQUEST_H_ #define REQUEST_H_ #include <stdint.h> typedef uint8_t u_int8_t; typedef uint16_t u_int16_t; typedef uint32_t u_int32_t; struct IPRequest { uint32_t unicast_ip; uint8_t unicast_port; uint8_t protocol_identifier; }; #endif /* REQUEST_H_ */
A première vue mon programme ne présente pas d'erreur mais lorsque je lance le .exe du Debug, celui ci ne répond plus....
Merci d'avance pour votre aide;
bonne soirée !
beaug
Partager