Boujour à tous,
Dans le cadre d'un projet, j'ai besoin de faire communiquer un "client" et un "serveur" à l'aide d'envoie de socket. Sans vous expliquez en détail ce projet, j'essaie dans un premier temps d'envoyer un simple "hello!" en unicast à une addresse IP local. J'ai crée pour cela une thread (ci dessous):
main:
classe "unicast_socket_sendto.c" :
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 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <pthread.h> #include "unicast_socket_sendto.h" /*Returns 0 if OK, a negative value if EOF.*/ int fpurge(FILE *f) { int c; while((c=fgetc(f))!=EOF && c!='\n') { } return (c==EOF ? -1 : 0); } void *send_uni(void *arg) { char *dest_ip = "100.0.0.0"; char *message = "hello"; int port = 7; while (1) { printf("Push a letter S or Q:\r\n "); char c = getchar(); fpurge(stdin); if ((c=='s')||(c=='S')) { printf("Message sent: %s\n", message); unicast_socket_sendto(port, dest_ip, message); system("BREAK"); return EXIT_SUCCESS; } else if ((c=='q')||(c=='Q')) { printf("QUIT"); break; } else { printf("Invalid key, tape 'S' to send a message, 'Q' to exit."); } } return NULL; } int main(void) { /* this variable is our reference to the second thread */ pthread_t thread; /* create a second thread which executes send_uni(void *arg) */ if(pthread_create(&thread, NULL, send_uni, NULL)) { fprintf(stderr, "Error creating thread\n"); return 1; } /* wait for the second thread to finish */ if(pthread_join(thread, NULL)) { fprintf(stderr, "Error joining thread\n"); return 2; } return 0; }
J'ai rajouté la fonction "recvfrom" afin de savoir si le message était bien réceptionné mais apparemment non^^
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 #include "unicast_socket_sendto.h" #include <errno.h> /* errno */ #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <sys/time.h> /* gettimeofday */ int unicast_socket_sendto( int port, char * dest_ip, char * message) { struct sockaddr_in sDest; int socket_id; WSADATA wsad; //Structure required to activate sockets int iResult = 0; // variable to perform tests char msg_rcv[1024]; //message received if (WSAStartup(2,&wsad) == 0) { printf("Sockets are now usable...\n"); } else { printf("Error n°%d : Error during initialization.\n", errno); //exit(errno); return errno; } //Initialization of the UDP socket socket_id = socket(AF_INET, SOCK_DGRAM,0); if(socket_id != -1) { printf("Initialization of the UDP socket successful.\n"); } else { printf("Erreur n%d : Unable to initialize socket.\n",errno); //exit(errno); return errno; } // initialization of the destination structure sDest.sin_family = AF_INET; sDest.sin_port = htons(port); sDest.sin_addr.s_addr = inet_addr(dest_ip); int sizeSdest = sizeof(sDest); //Size of the receiving structure // Sending the message printf("Sending of the socket ...\n"); iResult = sendto(socket_id,message,strlen(message)+1, 0, (struct sockaddr *)&sDest, sizeof(sDest)); if (iResult != -1) { printf("Successful message sending.\n"); } else { printf("Error n%d : Unable to send message.\n",errno); //exit(errno); return errno; } // Receiving the message iResult = recvfrom(socket_id, msg_rcv, sizeof(msg_rcv), 0, (struct sockaddr *)&sDest, &sizeSdest); msg_rcv[iResult]='\0'; // recvfrom renvoie le nombre d'octet lu! if (iResult != -1) { printf("successful message reception.\n"); } else { printf("Error n%d : Unable to receive message.\n",errno); //exit(errno); return errno; } // Display of the message without interference printf("The message is : %s\n", msg_rcv); //Closing the socket if (closesocket(socket_id) == 0) { printf("Socket closing.\n"); } else { printf("Error closing the socket.\n"); //exit(errno); return errno; } return 0; }
Je pense que c'est pas rapport au choix de l’adresse IP de réception. Doit elle être la même que celle de l'ordinateur ? Le choix du port aussi est il important ?
Voici le message que le prgramme m'affiche:
Push a letter S or Q:
S
Message sent: hello
Sockets are now usable...
Initialization of the UDP socket successful.
Sending of the socket ...
Successful message sending.
Error n34 : Unable to receive message.
Merci d'avance pour vos réponses,
Cordialement,
beaug.
Partager