1

私は初心者の C++/TCP プログラマーで、C++/VS2010/Windows 7 で TCP を使用したファイル転送のホーム割り当てを行っていました。

ネットワーク上の複数のクライアントをリッスンできるクライアントとサーバーを作成しました。ファイルを要求するサーバーにリクエストを送信すると、正しいサイズのファイルを受け取りますが、サーバーからクライアントにデータを送信すると、ガベージが発生します。

キャストのどこかで愚かな間違いを犯したと確信していますが、どこを特定することはできません。char*バイト単位で送信し、クライアント上のファイルに保存します。

何が問題なのですか?

// client code: 
unsigned int packlen = 0;
unsigned int flength = 0;
char* data = NULL;
if((packlen = recv(sock, (char*) &flength, sizeof(unsigned int), 0)) == 
    sizeof(unsigned int))
{
    flength = (unsigned int) flength;
    data = new char[flength];
}
unsigned char current;
char* buffer;
unsigned int accumlength = 0;

for(unsigned int i = 0; i < flength; ++i)
{
    if((packlen = recv(sock, (char*) &current , sizeof(unsigned int), 0)) 
        != sizeof(unsigned int))
    {
        err_sys("Receiving packet transfer error., exit");
    }
    data[i] = current;
}
ofstream output(argv[2], ios::binary);
output.write(data, flength);
if(data)
{
    delete[] data;
    data = NULL;
}


// Server code:
char* data = NULL;
unsigned long length;
string fname; 

data = new char[stat_buf.st_size];
ifstream input(reqp->filename, ios::binary);
input.seekg(0, ios::end);
unsigned int length = input.tellg();
if(length != stat_buf.st_size)
{
    err_sys("Problems with file size");
}

send(cs, (char*) &length, sizeof(unsigned int), 0);
Sleep(1000);  // wait a bit

input.read(data, length); // read all file at once.
for(unsigned int i = 0; i < length; ++i)
{
    unsigned char current = data[i];
    send(cs, (char*) &current, sizeof(unsigned char), 0);
}

ご協力いただきありがとうございます。

4

1 に答える 1

1

読み取りループ中にかなりの数のバイトを破棄しているようです:

recv(sock, (char*) &current, sizeof(unsigned int), 0)

はunsigned currentchar ですが、sizeof(unsigned int)それ以上のバイトを読み取るように要求します。したがって、recv() はその結果を別の場所に書き込みます (4 バイトを に書き込むためcurrent) 。

あなたはおそらく次のように書くべきです:

recv(sock, (char*) &current, 1, 0)

それはひどく非効率的ですが、少なくともうまくいくはずです。

于 2012-10-14T17:32:54.317 に答える