2017-02-14 1 views
-1

私は家のネットワーク上で多くの成功を収めずにファイルを受信しようとしています。私は約だけ受け取ることができます。このコードは10文字で提供されており、多くの進歩はありません。サーバー側の私のsend関数はうまく動作し、99%は私が理解していないこのコードで何かが起こっていることを確認しています。誰かが私が間違っていたことを親切に説明することができれば、私はそれをすべきだと大いに感謝するでしょう!私は、適切なエラーコードとそれが追加されるべきであることを認識していますが、ちょうどすべて整理しておくために、重い持ち上げコードが含まれています。ネットワークを介してCでファイルを受信

while(((len = recv(clientSocket,buffer, buffer, 0)) >0) && (remain_data > 0)){ 
    fwrite(buffer, sizeof(char), len,file); 
} 

は次のようになります。:他の人がすでに指摘したように

//********************** CLIENT CODE BELOW(RECEIVE FILE)** 
#include "StartConnection.h" 

#include <pthread.h> 
#include <errno.h> 

#define FILENAME "/Users/name/Desktop/holaS.txt" 
#define LENGTH (512) 

// port number where to port in application 
#define PORT_NUMBER (2005) 

int clientSocket; 
char buffer[LENGTH]; 
struct sockaddr_in serverAddr; 
socklen_t addr_size; 

void setup(){ 
    clientSocket = socket(PF_INET, SOCK_STREAM, 0); //socket create 
    serverAddr.sin_family = AF_INET; // settings 

    serverAddr.sin_port = htons(PORT_NUMBER); // port connection# 
    serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");//ip localhost 

    memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero); 

    // bind 
    addr_size = sizeof serverAddr; 
    connect(clientSocket, (struct sockaddr *) &serverAddr, addr_size); 

    /* FOR SENDING TEXT TO CONSOLE/REVEIVE 
    recv(clientSocket, buffer, 1024, 0); 
    Print the received message 
    printf("Data received: %s",buffer); 
    */ 

    rec_file(); // our entry 
    close(clientSocket); 
} 

char rec_file() { 
    recv(clientSocket, buffer, 512, 0); 

    int file_size = 0; 
    ssize_t len; 

    int remain_data = 0; 
    file_size = atoi(buffer); //512 

    FILE *file; 
    file = fopen(FILENAME,"ab+"); 

    if(file == NULL){ 
     printf("File Failed To Write"); 
    } 

    remain_data = file_size; 

    // 
    while(((len = recv(clientSocket,buffer, buffer, 0)) >0) && (remain_data > 0)){ 
     fwrite(buffer, sizeof(char), len,file); 
    } 

    return 0; 
} 




//*********** SERVER CODE (SEND FILEBELOW******************************************* 
#define PORT_NUMBER (2005) 
int welcomeSocket, newSocket; 
char buffer[512]; 
struct sockaddr_in serverAddr; 
struct sockaddr_storage serverStorage; 
socklen_t addr_size; 

void start_server(){ 
    welcomeSocket = socket(PF_INET, SOCK_STREAM, 0); // create socket 

    serverAddr.sin_family = AF_INET; //type 
    serverAddr.sin_port = htons(PORT_NUMBER); 

    // localhost ip 
    serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 

    memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero); 

    // bind address 
    bind(welcomeSocket, (struct sockaddr *) &serverAddr, sizeof(serverAddr)); 

    // wait for connection max 5 connections 
    if(listen(welcomeSocket,5)==0) 
     printf("Listening\n"); 
    else 
     printf("Error\n"); 

    addr_size = sizeof serverStorage; // accept <=5 

    newSocket = accept(welcomeSocket, (struct sockaddr *&serverStorage, &addr_size); 

    printf("\n OK PRINT MESSAGE"); 

    // char info[100]; 
    // scanf("%s",&info); 
    // strcpy(buffer,info); // for writing text to client 
    // send(newSocket,buffer,13,0); 

    send_file(); // or entry function for our file send 

    close(welcomeSocket); 
} 

void send_file(){ 
    /* 
     char file_name[100]; 

     printf("Please Print Name of your File You Wish To Send"); 
     scanf("%s",&file_name); 
    */ 

    FILE *f = fopen("/Users/name/Desktop/numbers.txt", "rb"); 

    fseek(f, 0, SEEK_END); 

    long fsize = ftell(f); 

    fseek(f, 0, SEEK_SET); //same as rewind(f); 

    char *string = malloc(fsize + 1); 

    fread(string, fsize, 1, f); 

    printf("\n Sending File"); 

    send(newSocket,string,13,0); 

    fclose(f); 

    printf("%s",string); 

    string[fsize] = 0; 
    free(string); 
} 
+2

コードには、 'buffer'と' clientSocket'の宣言と初期化がありません。さらに、 'while'ではバッファを一度バッファとして2回使用して長さを与えます。もしbufferが配列なら、あなたは 'sizeof buffer'をそこに入れたいと思います。 @カミカゼに加えて –

+0

;あなたは、サーバーが「ちょうど良い」状態になっていると確信していますか?サーバーから最初に送信するのは何ですか?それは文字列 "10"ですか? – user1810087

+0

'buffer'の宣言方法を示す必要があります。あなたがそれを使う方法は非常に奇妙で、おそらく間違っているようです。特に、第2の 'recv'コールは奇数です。そこでは、lengthパラメータ(size_t)として 'buffer'を渡します。おそらく512を渡したかったでしょうか?ところで、あなたは 'file_size'の簡単なプリントをやろうとしましたか?また、最初の 'recv'の戻り値もチェックしません。 – 4386427

答えて

1

、のようなこのコードのいくつかの明白な問題は、ある

while(((len = recv(clientSocket,buffer, sizeof(buffer), 0)) >0) && (remain_data > 0)){ 
    remain_data -= len; 
    fwrite(buffer, sizeof(char), len,file); 
} 

しかし、全体のクライアント/サーバーコードは厄介です。 "Beej's Guide to Network Programming"のようなものをチェックし、そこで与えられた例の1つから始めたいと思うかもしれません。

+0

あなたが参照しているループを修正しました。私はまだ私のファイルを受け取ることができませんが、さらに調査すると、私のファイルサイズとクライアントに送られた実際のバイトを比較すると、それは合わないので、私は現在サーバ側を修正しています... "Beej's"がその下線ロジックで非常に役立つことを証明してくれたことに感謝します。 – BinaryMind

0

これは正しく取得するのが難しいです。多くのマンページを読んでいて、別のコードを参照して作業してみると、これは初めてのCソケットでの作業ですが、ソケットや他のものについて学んだのでうれしいです。だから何が起こったのか両側が間違っていた。 「あなたはどうやっていますか?」という単純なテキストを使用し、1GBのファイルを送信することは意味が異なりますが同じです。適切なロジックを持つ適切なループとファイルディスクリプタを使用する必要があります。ループはバッファされたデータを持ち、送信ソケットに読み込む必要があります。また、受信側で想像できるように、バッファでも読み取る必要があります。私のためにこの戦いに本当に勝ったのはこのPDFでした(私はリンクを紛失して申し訳ありませんが、名前はグーグルで入力してください)** Dr.モスタファ・ハッサン・ダシャン・コンピュータ・インフォメーション・サイエンス・カレッジ 王サウド大学 "***これは、ソケットの使い方の詳細な例を示しています。また、何が起こっているのか解読して見ることができます。私はコミュニティのための厳しい愛から自分のコードを投稿したくないが、この本は同じ結論に達するのに役立つだろう。

+0

リンクを募集しています:faculty.ksu.edu.sa/mdahshan/CEN463FA09/07-file_transfer_ex.pdf彼は他の多くのpdfも探しているようです。 – BinaryMind

関連する問題