2017-08-25 4 views
0

J'ai eu une affectation dans un cours de mise en réseau, où j'ai implémenté une application de serveur client simple qui télécharge un fichier (texte) du serveur vers le client. Ce que j'ai fait en lisant continuellement le fichier sur le côté serveur et en envoyant les données par send et en recevant les données par recv appels. Les fichiers texte fonctionnent très bien.Création de ma propre application de réseau d'envoi vidéo en C

Mais je veux mettre en œuvre (pas une partie de l'affectation) une capacité d'envoi vidéo à cette application: D (pas besoin de clés USB entre amis!). J'ai utilisé le même code que l'envoi de fichier en espérant que cela fonctionnera. Si j'ai exécuté le code sur ma propre machine (serveur et client fonctionnant sur ma machine), la vidéo a été transférée avec succès. Mais quand le serveur et le client tournent sur des machines différentes (serveur sur l'ordinateur portable de mon ami et client sur le mien), j'obtiens le fichier vidéo, mais un fichier corrompu! :(

extrait de serveur pour envoyer le fichier:

void sendFile(FILE * fp, int * arg) 
{ 
    int socket=(int)*arg; 

    while(1) 
    { 
     /* First read file in chunks of 256 bytes */ 
     char buff[1024]={0}; 
     if(fp==NULL) 
     { 
      printf("File open error"); 
      return; 
     } 

     int nread = fread(buff,1,1024,fp); 

     /* If read was success, send data. */ 
     if(nread > 0) 
     { 

      if(nread != 1024) 
       buff[nread] = 0; 
      send(socket, buff, nread,0); 
     } 
     if (nread < 1024) 
     { 
      if (ferror(fp)) 
       printf("Error reading\n"); 
      break; 
     } 
    } 
} 

extrait de client pour la réception du fichier:

FILE * fp = fopen(fileName,"wb"); 
if(fp == NULL) 
{ 
    printf("Error opening file"); 
    return 1; 
} 

int bytesReceived = 0; 
char recvBuff[1024]; 
while((bytesReceived = recv(socket_client, recvBuff, 1024,0)) > 0) 
{ 
    fwrite(recvBuff, 1,bytesReceived,fp);  
    if(bytesReceived < 1024) 
     break; 
} 
fclose(fp); 
printf("File successfully downloaded!\n"); 

Le fichier vidéo après le téléchargement donne l'erreur:. This file is incomplete and cannot be played. Je veux vraiment faire ce réseau application, que je peux utiliser dans ma vie quotidienne! Toute idée, où les extraits se trompent? Toute aide appréciée.Merci à l'avance! :)

+0

1) Il y a * milliers * applications prêtes à et librement disponibles que vous « pouvez utiliser dans la vie quotidienne », ce qui sera beaucoup plus pratique et beaucoup plus polyvalent que vous programme de ligne de commande. 2) 'recv (socket_client, recvBuff, 1024,0)' - ne bloquera * pas * s'il y a moins de 1024 octets reçus, et il n'est pas garanti qu'une lecture vous donnera immédiatement 1024 octets. Mais toute lecture comme celle-ci, vous la traitez comme une erreur. –

+0

1) J'ai dit que je voulais faire quelque chose que je veux utiliser. 2) S'il vous plaît élaborer/toutes les alternatives? – Akash

+0

Simple comme cela, vous pourriez recevoir des paquets de données plus courts et cela ne signifie pas qu'il n'y aura pas plus de données à venir. Vous devrez boucler jusqu'à ce que vous obteniez '0' (socket fermé) ou' -1' (erreur). –

Répondre

0

Une autre façon - attendre toutes les données du message:

while((bytesReceived = recv(socket_client, recvBuff, 1024, MSG_WAITALL)) > 0)