0

サーバーにファイルをアップロードするアプリケーションを作成しています.C++ Winsockで、マルチスレッド技術を使用して正常に作成し、エラーなしで正常に動作します. しかし、オーバーラップ I/O 手法を利用したい場合、サーバーがすべてのファイルを受信するわけではないという問題に直面しました。

ファイルの送受信に関連するコード セクションを投稿します。

int iRecv = WSARecv(AcceptSocket, &DataBuf, 1, &RecvBytes, &Flags, &AcceptOverlapped, NULL);
int iBytesReceived = 0;
while(true)
{   
    printf("error =%d\r",WSAGetLastError());
    // Step 7:
    //  Determine the status of the overlapped
    //  request
    WSAGetOverlappedResult(AcceptSocket, &AcceptOverlapped, &BytesTransferred, FALSE, &Flags);

    // Step 5:
    //  Wait for the overlapped I/O call to complete
    Index = WSAWaitForMultipleEvents(EventTotal, EventArray, FALSE, WSA_INFINITE, FALSE);

    // Index should be 0 because we 
    // have only one event handle in EventArray
    // Step 6:
    //  Reset the signaled event
    WSAResetEvent(EventArray[Index - WSA_WAIT_EVENT_0]);
    if( iRecv>=0)
    {    
        iBytesReceived += RecvBytes;
        fwrite(DataBuf.buf,sizeof(char), RecvBytes,flUploadedFile);
    }
    if (lReceivedBytes>=iFilesize)  break;

    Flags = 0;
    ZeroMemory(&AcceptOverlapped, sizeof(WSAOVERLAPPED));
    AcceptOverlapped.hEvent = EventArray[Index - WSA_WAIT_EVENT_0];

    DataBuf.len = DATA_BUFSIZE;//1024
    DataBuf.buf = buffer;

    iRecv=WSARecv(AcceptSocket, &DataBuf, 1, &RecvBytes, &Flags, &AcceptOverlapped, NULL);
}

サーバーがファイル名とファイルサイズを正しく受信していることに言及する必要があります。

クライアント側

void UploadFile(....)
{
    .
    .
    .   
hFile = CreateFile(fp,GENERIC_READ, FILE_SHARE_READ, NULL,   OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,NULL);
bTrans= TransmitFile(connectedSocket,hFile,0,0,NULL,NULL,0) ;     
    .
    .
}

私のコードにエラーはありますか? 何か提案や助けはありますか?ハマった。

4

1 に答える 1

1

WSARecv()最初はデータの最初の部分(ファイル名とサイズ)ですぐに返されるようです。次に、OS が (イベント ハンドルを設定することによって) 結果が利用可能であることを通知する前に、オーバーラップした結果を取得する必要があるため、コードはブロックされます。

オーバーラップ I/O を使用する場合は、おそらく完了ルーチンを使用する必要があります。これにより、より簡単になります。

于 2012-12-28T07:49:06.913 に答える