2010-09-06 6 views
1

J'ai créé de petits programmes socket (client/serveur). Le client transférera tous les formats de fichiers au serveur. Le problème auquel je suis confronté maintenant est - J'ai lu le fichier mp3 en mode binaire et envoyé au serveur. Le serveur lit le contenu du tampon et crée un fichier. Mais quand j'essaie d'ouvrir le fichier, il ne s'ouvre pas. Mais la taille reste la même que celle d'origine. Quelqu'un peut-il indiquer où je me trompe? Voici mon code côté serveur:Programmation de socket en c

recv(newSocket,fileSize,50,0); //Receiving file size 

// buffer=malloc(atoi(fileSize)); 
    int i=0; 

    recv(newSocket,buffer,atoi(fileSize),0); 
    fwrite(buffer,1,atoi(fileSize),out); 

côté client: fread (données, 1, lSize, fichier);

sprintf(temp,"%ld",lSize); 

    send(socketDes,temp,strlen(temp),0); 


    send(socketDes,data,strlen(data),0); 
+0

Vérifier les valeurs de retour! recv, envoyer, fread etc. tous retournent quelque chose. Ce quelque chose est très important. – nos

+0

Je suppose que l'envoi ne fonctionne pas correctement. essayez int check = send(); Si la vérification est égale à la température, le travail d'envoi est correct. et si vous pouvez essayer ouvrir le fichier avec certains SW comme Audacity – EsmaeelE

Répondre

4

Il se pourrait que, lors de la lecture d'une prise basée sur les flux, vous ne recevez pas tous les octets que vous pensez obtenir. Ensuite, vous écrivez un fichier de la bonne taille, mais seulement le début du fichier aura des données significatives. Si vous utilisez TCP (une connexion orientée flux), quand vous allez lire depuis le socket dans un buffer (vous utilisez probablement un tableau byte/char), vous n'aurez que tous les octets disponibles au moment de l'appel. L'appel à la fonction de lecture retournera immédiatement mais le tampon dans lequel les données sont écrites ne sera que partiellement plein.

en cours lire à partir de la socket (généralement l'appel de lecture va retourner ce nombre), puis lire à plusieurs reprises à partir du socket jusqu'à ce que vous avez tous les octets dont vous avez besoin .

Mise à jour

En ce qui concerne votre code, il semble certainement que vous faites appel à un seul recv() et ne cochez pas pour vous assurer a été transféré la totalité du fichier. Vous devrez mettre cela en boucle et lire continuellement les données jusqu'à ce que vous ayez lu autant que vous le souhaitez (dans ce cas, la taille du fichier entier).

Vous pouvez également résoudre ce problème du côté de l'envoi. Même si vous avez la commande de sommeil entre les appels à send, send enverra seulement une certaine quantité de données par appel. Vous devrez placer send dans une boucle et continuer à envoyer des données jusqu'à ce que vous ayez envoyé toutes les données que vous souhaitez envoyer.

Considérez ce qui suit le code (pseudo- non testé) pour recv: se

int numberOfReceivedBytes=0; 
while (numberOfReceivedBytes<fileSize){ 
    numberOfReceivedBytes+=recv(newSocket,buffer + numberOfReceivedBytes,sizeof(*buffer),0) 
} 

De plus, il semble que lorsque vous lisez la taille du fichier de la prise, vous pouvez accidentellement faire partie du fichier en plus la taille du fichier. Assurez-vous que vous savez exactement combien d'octets indiqueront la taille réelle du fichier et ne liront que de nombreux octets. En outre, atoi ne fonctionne que pour la représentation chaîne (ASCII) d'un nombre. Votre serveur reçoit le numéro réel.

Pour faire envoyer:

int numberOfSentBytes=0; 
while (numberOfSentBytes<fileSize){ 
    numberOfSentBytes+=send(newSocket,buffer+numberOfSentBytes,fileSize-numberOfSentBytes+1,0); 
} 
+0

Ok merci laissez-moi essayer et vous faire savoir – Allwyn

+0

Pouvez-vous s'il vous plaît laissez-moi savoir comment envoyer et recv en boucle dans ref mon code. Depuis que je suis lu le contenu du fichier entier dans les données en une seule fois. Je ne suis pas sûr de savoir comment diviser et envoyer. Pouvez-vous aider s'il vous plaît à cet égard – Allwyn

+0

Vous pouvez généralement lire le fichier entier en une seule fois (bien que je ne compterais pas là-dessus - vous pourriez vouloir mettre dans une boucle aussi). J'ai édité ma réponse pour montrer un exemple d'envoi en boucle. –

0

Vous essayez d'ouvrir le fichier comment, avec un lecteur MP3 après qu'il a été transmis? Peut-être que vous n'écrivez pas le fichier de sortie en mode "binaire"; sur certains systèmes d'exploitation, les octets seront traduits, saccageant le fichier s'il est réellement binaire et non textuel.

Si vous ouvrez le fichier pour l'écriture en utilisant fopen(), comprennent un "b" dans le deuxième argument:

FILE *out = fopen("incoming.mp3", "wb"); 
+0

Voici mon code pour votre ref: – Allwyn