Quel est le type de nb_send ?
Quel est le type de nb_send ?
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
La j'ai juste remis la boucle dans laquelle ca plante, les définitions sont sur la page précédente (en bas de la page)
Sinon pour nb_send
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2size_t nb_send;
size_t est un type non-signé.
Edit: Ça m'apprendra à me fier aux fonctions Win32...
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Ben voilà. T'as compris la différence ?Envoyé par Creuvard
La valeur retournée par send() est d'abord un entier signé (officiellement, selon POSIX.1, qui est une norme ISO, un ssize_t, mais non standard C, ou peut être C99...).
Ca permet de savoir si il y a erreur ou non.
Après le test, et seulement après, on peut considérer la valeur comme non signée. Pas avant, sinon, on ne voit jamais le -1.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 ssize_t err = send(...); if (err != SOCKET_ERROR) {
J'ai donné précédemment une version un peu moins paranoïaque et probablement plus portable...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 size_t n = (size_t) err;
Pas de Wi-Fi à la maison : CPL
Officiellement (POSIX.1), un ssize_t...Envoyé par Médinoc
Pas de Wi-Fi à la maison : CPL
Je viens de passer mon size_t en ssize_t et j'ai plus de souci avec GCC (avec les options -Wall -Wextra -O2 donc c'est déja une chose de gagné, je vous en remercie
Voici donc ma fonction telle qu'elle est a l'instant t (avec les modifs apportées depuis le début du post)
Mon code me semble suivre les conseils que vous m'avez donné, pourtant j'ai toujours le même problème, j'ai donc surement ratté quelque chose, mais je vois pas quoi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Edit: Voir post ci-aprés
Malgré mon insistance, il y a toujours un 'return (NULL);' inadéquate que ton compilateur devrait signaler...Envoyé par Creuvard
Si il ne le fait pas, c'est qu'il est mal réglé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 main.c: In function `envoie_de_fichier': main.c:18: warning: `return' with a value, in function returning void
http://emmanuel-delahaye.developpez....tm#cfg_compilo
Je déconseille de combiner affectation et test dans un if. Ca alourdit inutilement.
Pas de Wi-Fi à la maison : CPL
Arf c'est une erreur de copier-coller de ma part. désolé.Envoyé par Emmanuel Delahaye
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 #define BUFSIZE 512 #define SOCKET_ERROR -1 void envoie_de_fichier(int socket,char *nom, int debut, int fin) { int reste; int nb_lu; ssize_t nb_send; char buffer[BUFSIZE]; FILE *fichier_src; reste = fin - debut; fichier_src = fopen (nom, "rb"); if ( fichier_src == NULL) { perror("fopen() "); return ; } fseek(fichier_src, debut, SEEK_SET); while ( reste > BUFSIZE) { nb_lu = fread( buffer, 1, sizeof buffer, fichier_src); if (nb_lu >= 0 ) { nb_send = send(socket, buffer, nb_lu, 0); if( (nb_send != SOCKET_ERROR) reste = reste - nb_lu; else { perror("send() "); fclose(fichier_src); return ; } } else { perror("fread()"); } } nb_lu = fread( buffer, sizeof(char), reste, fichier_src); nb_send = send(socket, buffer, nb_lu, 0); if(nb_send == SOCKET_ERROR) { perror("write() "); fclose(fichier_src); return ; } fclose(fichier_src); }
Salut à tous.
Voila je viens de remettre le nez dans ma fonction.
Il semblerait que (selon moi, donc cela n'est point sur dutout) que le problème vienne du signal SIGPIPE renvoyé par la fonction "socket()"
J'ai trouvé un "man setsockopt()" dans lequel on peut passer à cette fonction la fonction " SO_NOSIGPIPE "Envoyé par man socket(2)
Sauf que avec cette option j'ai une erreur de compilation.Envoyé par man setsockopt(2)
Le message du compilateurEnvoyé par create_tcp_server()
J'ai oublié quelque chose ? Ou il faut que je cherche ailleurs ?Envoyé par gcc
A tout hasard dans quel header se trouve SO_NOSIGPIPE ?
" Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]
A priori dans:Envoyé par hegros
cf ce lien => http://www.hmug.org/man/2/setsockopt.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 #include <sys/types.h> #include <sys/socket.h>
Ils sont bien dans la fonction qui crée le socket.
Je m'y suis remis ce matin et j'i finalement trouvé deux solutions.
Rajouter le flag MSG_NOSIGNAL à la fonction "send()"
Et puis l'utilisation de la commande "signal(SIPIPE, SIG_IGN)"
La seconde méthode est peut être une méthode moin correcte (Bien que j'en sache rien) mais elle a le mérite de marcher sur les déconnexions impromptue des client sur les connexions via la lib OpenSSL (SSL_write)
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager