Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 20/03/2007, à 23:31

Moka_one

[résolu] [C++ réseau] pb de descripteur fichier et de boite reseau

bonjour
alors ce programme comporte un serveur et un client qui demande au serveur un fichier
ce fichier est envoyer par le serveur via plusieurs paquets jusqu'au code stop.
le probleme c'est que voici le resulttat à l'execution

Tiens bonjour salon
Vous avez demandé le fichier /home/salon/Desktop/test de taille  7
Success 4
Bad file descriptor 4 coucou

Bad file descriptor 4 *

donc apparement dans le fichier client le write ne fonctionne pas pour cause de bad file descriptor
alors que le open fonctionne (errno revoie success) et le fd genéré est le meme que celui utilisé pour le write
C'est à n'y rien comprendre
je vous poste le code du client (le serveur marche puisque le fichier arrive correctement)

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include "sockdist.h"
#include"sock.h"
using namespace std;

int main(int argc, char * argv[])
{
Sock brCli(SOCK_STREAM,0);
int descBrCli;
if (brCli.good()) descBrCli=brCli.getsDesc();
//designer le serveur
SockDist brPub(argv[1], short(21345));
struct sockaddr_in * adrBrPub=brPub.getAdrDist();
int lgAdrBrPub=sizeof(struct sockaddr_in);
//demander une connection
int erlude = connect(descBrCli,(struct sockaddr *)adrBrPub,lgAdrBrPub);

char tamponReception[256];
char tamponReception2[256];
int uid= getuid();
char tamponEnvoi[256];
char tamponEnvoi2[256];
strncpy(tamponEnvoi2,argv[2],strlen(argv[2])+1);
sprintf(tamponEnvoi,"%1d",uid);
int ensif = send (descBrCli,tamponEnvoi,sizeof(tamponEnvoi),0);
int egral = send (descBrCli,tamponEnvoi2,strlen(tamponEnvoi2),0);
int ox = recv (descBrCli,tamponReception,sizeof(tamponReception),0);
int elligent = recv (descBrCli,tamponReception2,sizeof(tamponReception2),0);
cout<<tamponReception<<endl;
cout<<tamponReception2<<endl;
char erreur[256]="#";
if (*tamponReception2 != *erreur){
	int fd;
	fd=open("recu",O_CREAT,S_IRWXU);                                    <--- génération du fd via open success
	cout<<strerror(errno)<<fd<<endl;
	char fichier[256];
	char fin[256]="*";
	while(*fichier != *fin){
		int j;
		int olerable = recv (descBrCli,fichier,sizeof(fichier),0);
		j=write(fd,fichier,sizeof(fichier));                                      <--- erreur ici alors que le fd est le meme
		cout<<strerror(errno)<<" "<<fd<<" "<<fichier<<endl;
		
	}
	close(fd);
	}
else{
	cout<<"erreur le fichier demandé n'existe pas sur le serveur ou le chemin spécifié est incorrect"<<endl;
	
}

}

voila si quelqu'un peut me dire ce qui ne vas pas cela m'aiderais enormement

Dernière modification par Moka_one (Le 23/03/2007, à 01:47)


La défaite est éphémère
Seule la victoire est éternelle

Hors ligne

#2 Le 22/03/2007, à 03:33

Moka_one

Re : [résolu] [C++ réseau] pb de descripteur fichier et de boite reseau

Bon alors tant qu'on y est je cherche un moyen de vider ma boite reseau
je m'explique mettons que je recoit 5000 caracteres , je les lis, et j'en recoit 10000 autres en fait mon soucis c'est que les 10000 autres ne sont pas la mais j'ai toujours les 5000 premiers bien que j'ai deja fais un recv de la taille 5000. Du coup je ne copie dans mon fichier que les 5000 premiers
en esperant que cette nouvelle question sucitera un peu plus de reponses wink
merci par avance

Dernière modification par Moka_one (Le 22/03/2007, à 03:34)


La défaite est éphémère
Seule la victoire est éternelle

Hors ligne

#3 Le 23/03/2007, à 01:51

Moka_one

Re : [résolu] [C++ réseau] pb de descripteur fichier et de boite reseau

Donc vu que personne n'avait l'air inspiré j'ai cherché et fini par trouver.
Alors pour le file descripteur mon soucis venais du fait que je faisais un sizeof de mon char or sizeof
ne m'a posé que des problemes doc le remplacer par un int de la taille voulue directement m'as permis de
résoudre directement mes 2 problemes, car en effet ma boite réseau ne se vidait pas mais maintenant elle le fait correctement.
Donc en résumé lorsqu'on lit une boite réseau les caractères sortent automatiquement de cette dernière.
voila on sait jamais ça pourrait servir à quelqu'un smile


La défaite est éphémère
Seule la victoire est éternelle

Hors ligne