Bonjour,
J'écris actuellement un programme me permettant d'envoyer le contenu d'un fichier par sockets C. Je précise que ce fichier comporte plusieurs lignes. Mon programme fonctionne correctement, mais il n’envoie que la dernière ligne du fichier !
Le code est le suivant:
Client
Serveur
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 #include <sys/types.h> //différentes librairies #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <stdio.h> #include <unistd.h> #include <string.h> /* memset() */ #include <sys/time.h> /* select() */ #define TAILLE_MAX 1000 #define REMOTE_SERVER_PORT 50000 //on utilise ici le port 50000 int main(void) { //déclaration des variables char *buffer; int sock, rc, i; struct sockaddr_in cliAddr, ServAddr; int taille = 100; FILE* fichier = NULL; char chaine[TAILLE_MAX] = ""; fichier = fopen("plop.txt", "r"); printf("Données envoyées:"); if (fichier != NULL) { while (fgets(chaine, TAILLE_MAX, fichier) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL) { printf("%s", chaine); // On affiche la chaîne qu'on vient de lire } fclose(fichier); } //initialisation du buffer buffer = (char *) malloc(sizeof(char) * taille); buffer = "ça marche !!!!!!"; //message envoyé au serveur printf("les données ont été envoyées\n"); //simple texte pour la lisibilité du programme //initialisation de la socket ServAddr.sin_family = AF_INET; ServAddr.sin_port = htons(REMOTE_SERVER_PORT); ServAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //création de la socket sock = socket(AF_INET,SOCK_DGRAM,0); //initialisation de la socket cliAddr.sin_family = AF_INET; cliAddr.sin_addr.s_addr = htonl(INADDR_ANY); cliAddr.sin_port = htons(0); rc = bind(sock, (struct sockaddr *) &cliAddr, sizeof(cliAddr)); //bind //envoi du message rc=sendto(sock ,chaine, taille, 0, (struct sockaddr *)&ServAddr, sizeof(ServAddr)); return 1; }
Que dois-je changer pour envoyer TOUTES les lignes de mon fichier au serveur ?
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 #include <sys/types.h> //différentes librairies #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <stdio.h> #include <unistd.h> /* close() */ #include <string.h> /* memset() */ #define LOCAL_SERVER_PORT 50000 //on utilise ici le port 50000 int main(void) { //déclaration des variables int sock, rc, n, cliLen; struct sockaddr_in cliAddr, servAddr; char msg[1000]; //création de la socket sock=socket(AF_INET, SOCK_DGRAM, 0); //initialisation de la socket servAddr.sin_family = AF_INET; servAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); servAddr.sin_port = htons(LOCAL_SERVER_PORT); rc = bind (sock, (struct sockaddr *) &servAddr,sizeof(servAddr)); //création d'une boucle infinie while(1) { //initialisation du buffer memset(msg,0x0,100); //pour la réception du message cliLen = sizeof(cliAddr); n = recvfrom(sock, msg, 100, 0, (struct sockaddr *) &cliAddr, &cliLen); //affichage du message reçu printf("Message recu : \n"); printf("%s \n",msg); }//fin de la boucle infinie return 0; }
Merci par avance.
Simon
Partager