2

私はいくつかの C++ ソケットの例を扱っています。クライアントが実行され、サーバーに接続できますが、ファイルを送信できません。に問題があると思いますが、send()修正できません。編集: エラー メッセージは「接続がピアによってリセットされました」です。

どんなアイデアでも大歓迎です。

QT 4.7.4 で OpenSuSE を使用しています

送受信機能はこちら

void str_server(int sock)
{
    char buf[1025];
    const char* filename = "//home//romanov//Documents//HelloWorld-build-desktop-Qt_4_7_4_in_PATH__System__Release//ss.png";

    FILE *file = fopen(filename, "rb");
    if (!file)
    {

        cerr<<"Can't open file for reading";
        return;
    }
    while (!feof(file))
    {
        int rval = fread(buf, 1, sizeof(buf), file);//read value
        if (rval < 1)
        {

            cerr<<"Can't read from file";
            fclose(file);
            return;
        }

        int off = 0;
        do
        {
            int sent = send(sock, &buf[off], rval - off, 0);
            if (sent < 1)
            {
                // if the socket is non-blocking, then check
                // the socket error for WSAEWOULDBLOCK/EAGAIN
                // (depending on platform) and if true then
                // use select() to wait for a small period of
                // time to see if the socket becomes writable
                // again before failing the transfer...

                cout<<"Can't write to socket";
                fclose(file);
                return;
            }

            off += sent;
        }
        while (off < rval);
    }

    fclose(file);
}

//===================

void RecvFile(int winsock)
{
    int rval;
    char buf[1025];
    FILE *file = fopen("//home//romanov//Documents//HelloWorld-build-desktop-Qt_4_7_4_in_PATH__System__Release//ss2.png", "wb");
    if (!file)
    {
        printf("Can't open file for writing");
        return;
    }

    do
    {
        rval = recv(winsock, buf, sizeof(buf), 0);
        if (rval < 0)
        {
            // if the socket is non-blocking, then check
            // the socket error for WSAEWOULDBLOCK/EAGAIN
            // (depending on platform) and if true then
            // use select() to wait for a small period of
            // time to see if the socket becomes readable
            // again before failing the transfer...

            printf("Can't read from socket");
            fclose(file);
            return;
        }

        if (rval == 0)
            break; //line 159

        int off = 0;
        do
        {
            int written = fwrite(&buf[off], 1, rval - off, file);
            if (written < 1)
            {
                printf("Can't write to file");
                fclose(file);
                return;
            }

            off += written;
        }
        while (off < rval);
    }  //line 175
    while (1);
    fclose(file);
}
4

1 に答える 1

0

ええと、問題は私の悪いところです。私は で間違ったソケットを読みましたrecvFile()同じ問題に遭遇した場合は、チェックアウトする必要があります。

于 2013-04-07T00:36:45.250 に答える