Quel est le type de nb_send ?
Quel est le type de nb_send ?
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...
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;
Officiellement (POSIX.1), un ssize_t...Envoyé par Médinoc
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.
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 ?
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