Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C++;传输文件和重叠I/O 我正在编写一个应用程序,负责上传文件到服务器,在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); }_C++_Winsock - Fatal编程技术网

使用C++;传输文件和重叠I/O 我正在编写一个应用程序,负责上传文件到服务器,在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); }

使用C++;传输文件和重叠I/O 我正在编写一个应用程序,负责上传文件到服务器,在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); },c++,winsock,C++,Winsock,我必须提到的是,服务器正在正确地接收文件名和文件大小 客户端 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) ;

我必须提到的是,服务器正在正确地接收文件名和文件大小

客户端

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) ;     
    .
    .
}

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

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


在使用重叠I/O时,您可能应该使用完成例程,这将使它更容易。

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