2016-10-14 15 views
0

クライアントからサーバーに送信するときに、出力ファイルに奇妙な文字がたくさんあります。サーバーを配列にストリームしてプリントアウトすると、見た目がよく見えるようになります。しかし、私はそれをサーバーに送ると、テキスト文書のいたるところに奇妙な文字とMICROSOFTがたくさんあります。誰が間違っているのか分かっていますか?サーバー側で奇妙な文字が出力される

クライアント:

if(sendSize <=0){ 
    for(;;){ 
     unsignedchar buff[256]={0}; 
     int nread = fread(buff,1,256, fp); 

     total = total + nread; 
     percentage =(total/fFileSize)*100; 
     printf("\r%s: Percentage sent: %.2f", NAME_C, percentage); 
     /* Send data in 256 byte chunks */ 
     if(nread >0){ 
      send(clientSock, buff, nread, 0); 
     } 

     if(nread <256){ 
      if(feof(fp)){ 
       printf("\nSend Success!\n"); 
       break; 
      } 
     } 
    } 
    //printf("%.2f", total); 
} 

サーバー:それは代わりに>0を使用しなければならないとき

/* Receive data from client */ 
    char* fileName ="test.txt"; 
    FILE*fp = fopen(fileName,"w+");; 

    float total =0; 
    float bytesReceived; 
    unsignedchar buff[256]={0}; 
    float percentage =(bytesReceived/total)*100; 

    while((bytesReceived = recv(listenSock, buff,sizeof(buff),0))<0){ 
     //bytesReceived = recv(listenSock, buff, 256, 0); 
     if(bytesReceived >0){ 
      printf("DONE"); 
     } 
     //total = total + bytesReceived; 
     fwrite(buff,sizeof(char), bytesReceived, fp); 
     //printf("\r%s: Percentage received: %.2f", NAME_C, percentage); 
    } 
+1

'unsignedchar'である何よりの代わりにこのような何かを試してみてください? – Barmar

+0

2つのシステムではどのオペレーティングシステムを使用していますか?いずれかがWindowsの場合は、テキストファイルでない場合はファイルを開くときにバイナリモードを使用する必要があります。 – Barmar

+0

どうやってそれをしますか? –

答えて

0

お使いのサーバーのrecv()ループが<0を使用しています。 recv()は、エラーが発生した場合は-1、正常に切断された場合は0、受信したバイト数が0を返します。

また、listenSock実際のリスニングソケットか、またはaccept()によって返されたソケットですか?後者をrecv()に渡す必要があります。私の推測では、代わりに前者を渡しているので、recv()が失敗し、-1が返されます。その後、buffのゴミとという値のループ本体が入力されます。 fwrite()の3番目のパラメータは、そうsize_tの大きさに応じて、符号付き値の-1 4294967295あるいは18446744073709551615符号なし値として解釈されますを渡し、符号なし型でsize_t、です。いずれにしても、ファイルにゴミを書き込んだり、無効なメモリにアクセスしようとしてコードをクラッシュさせたりすることになります。

あなたのコードには他にも小さな問題があります。

クライアント::

if(sendSize <=0){ 
    unsigned char buff[256]; 
    do{ 
     int nread = fread(buff, sizeof(char), 256, fp); 
     if (nread > 0){ 
      total += nread; 
      percentage = (total/fFileSize)*100; 
      printf("\r%s: Percentage sent: %.2f", NAME_C, percentage); 
      /* Send data in 256 byte chunks */ 
      if (send(clientSock, buff, nread, 0) == -1){ 
       printf("\nSend Failed!\n"); 
       break; 
      } 
     } 
     if (nread != 256){ 
      if (feof(fp)){ 
       printf("\nSend Success!\n"); 
      else 
       printf("\nRead Failed!\n"); 
      break; 
     } 
    } 
    while (1); 
    //printf("%.2f", total); 
} 

サーバー:

/* Receive data from client */ 
char* fileName = "test.txt"; 
FILE* fp = fopen(fileName, "wb+"); 
if (!fp){ 
    printf("\nOpen Failed!\n"); 
} 
else{ 
    float total = 0; 
    float percentage = 0; 
    int bytesReceived; 
    unsigned char buff[256]; 

    do{ 
     bytesReceived = recv(acceptedSock, buff, sizeof(buff), 0); 
     if (bytesReceived <= 0){ 
      if (bytesReceived < 0){ 
       printf("\nRecv Failed!\n"); 
      } 
      else{ 
       printf("\nDisconnected!\n"); 
      } 
      break; 
     } 
     //total += bytesReceived; 
     //percentage = ... 
     if (fwrite(buff, sizeof(char), bytesReceived, fp) != bytesReceived){ 
      printf("\nWrite Failed!\n"); 
      break; 
     } 
     //printf("\n%s: Percentage received: %.2f", NAME_C, percentage); 
    } 
    while (1); 
} 
関連する問題