【问题标题】:TCP winsock File uploading using C++ TransmitFile and overlapped I/OTCP winsock 使用 C++ TransmitFile 和重叠 I/O 上传文件
【发布时间】:2012-12-27 14:34:59
【问题描述】:

我正在编写一个负责将文件上传到服务器的应用程序,在 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) ;     
    .
    .
}

我的代码中是否存在任何错误?有什么建议或帮助吗?我被卡住了。

【问题讨论】:

  • MSDN, WSARecv, lpNumberOfBytesRecvd [out]: '如果接收操作立即完成,则指向此调用接收的数据的数量(以字节为单位)的指针'。如果没有,(而且很可能不会),接收到的字节将通过调用 WSAGetOverlappedResult() 返回。在等待 hEvent 句柄返回之前调用 WGOR() 并且不检查 WGOR 返回值是否有错误,这不是一个好主意。当您在调试器下运行此代码时,您在各个阶段看到的各种值是什么?
  • 此外,使用完成例程或完整的 IOCP 来处理这类事情要容易得多。 hEvent 等待机制是一个要管理的 PITA。

标签: c++ winsock


【解决方案1】:

似乎第一个WSARecv() 立即返回数据的第一部分(文件名和大小)。然后代码阻塞,因为您想在操作系统发出结果可用(通过设置事件句柄)发出信号之前获得重叠的结果。

也许您应该在使用重叠 I/O 时使用完成例程,这样会更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 2019-03-06
    • 2010-09-08
    • 2023-03-08
    相关资源
    最近更新 更多