TCP winsock文件上传,使用c++ TransmitFile和重叠I/O
TCP winsock File uploading using C++ TransmitFile and overlapped I/O
我正在编写一个负责上传文件到服务器的应用程序,在c++ Winsock中,我使用多线程技术成功地编写了它,它工作正常,没有错误。但是当我想使用重叠i/O技术时,我遇到了一个问题,即不是所有的文件都被服务器接收。
我将发布与发送和接收文件相关的代码部分。
int iRecv = WSARecv(AcceptSocket, &DataBuf, 1, &RecvBytes, &Flags, &AcceptOverlapped, NULL);
int iBytesReceived = 0;
while(true)
{
printf("error =%dr",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) ;
.
.
}
我的代码中是否存在任何错误?有什么建议或帮助吗?
In似乎第一个WSARecv()
立即返回数据的第一部分(文件名和大小)。然后代码阻塞,因为您想要在操作系统信号显示结果可用之前获得重叠的结果(通过设置事件句柄)。
也许你应该在使用重叠I/O时使用一个完成例程,这会使它更容易。
相关文章:
- Ardunio UNO解决了多个重叠的定时器循环
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- 算术序列与区间的最大重叠
- 按顺序声明的字符数组重叠
- 拆分重叠段
- 纹理单位重叠?渲染了错误的纹理
- 什么可以防止类中相邻成员重叠
- 对多个(可能)重叠范围进行分区的最简单算法
- 英特尔将指令存储在重叠的内存区域
- 我可以在同一条链上生成多个协程而不会重叠吗?
- 使用迭代器 C++ 删除矢量中的重叠字符串
- USB-HID 读/写(重叠)等待单个对象不返回C++
- 如何在opencv C++中合并重叠的矩形?
- 如何在c/c++中检查两个任意内存范围是否重叠
- 为什么重复的空基存储不与 vtable 指针重叠?
- Qt-grabtoimage()和scale生成两个重叠的图像
- 使用命名管道块的读取文件,尽管使用重叠
- 视觉C++合并重叠的字符串
- 非重叠连续子数组的最大长度总和
- TCP winsock文件上传,使用c++ TransmitFile和重叠I/O