管道异步通讯的问题

武林群雄 2011-06-27 09:52:29
在编写管道服务端时,碰到一个问题,就是异步接收数据时开始的几组数据老是丢,怎么都找不到原因,拜托坛子里的各位高手给看一下~~~代码如下:

HANDLE onePipeHandles;
OVERLAPPED oneOvlap;

HANDLE oneEvent;

if ((onePipeHandles = CreateNamedPipe(_T("\\\\.\\PIPE\\SiTrackerDataMgr"),PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,PIPE_TYPE_BYTE | PIPE_READMODE_BYTE,1,0,Pipe_BUF_SIZE,5000,NULL)) == INVALID_HANDLE_VALUE)
{
_tprintf(_T("CreateNamedPipe for pipe failed with error %d\n"), GetLastError());
return 0;
}
if ((oneEvent = CreateEvent(NULL,TRUE,FALSE,NULL)) == NULL)
{
_tprintf(_T("CreateEvent for pipe failed with error %d\n"), GetLastError());
}

ZeroMemory(&oneOvlap,sizeof(OVERLAPPED));
oneOvlap.hEvent = oneEvent;

if (ConnectNamedPipe(onePipeHandles,&oneOvlap) == 0)
{
if (GetLastError() != ERROR_IO_PENDING)
{
_tprintf(_T("ConnectNamedPipe for pipe failed with error %d\n"), GetLastError());
CloseHandle(onePipeHandles);
return 0;
}
}
_tprintf(_T("Server is now running\n"));


DWORD Ret;
DWORD BytesTransferred;
TCHAR Buffer[BUFFER_SIZE];
DWORD BytesRead;
UINT OneRecv = 0;
long TotalRecv = 0;
long TotalRecv1 = 0;


//读数据
int nIndex = 0;
while(true)
{
_tprintf(_T("=======================================================\n"));
if (Ret = WaitForSingleObject(oneEvent,INFINITE) == WAIT_FAILED)
{
_tprintf(_T("WaitForSingleObject failed with error %d\n"),GetLastError());
return 0;
}

//if (nIndex == 0)加不加这个判断结果都一样
{
ResetEvent(oneEvent); //防止另一个终端同时进入
}

_tprintf(_T("Ret = WaitForSingleObject(...)= %d\n"),Ret);


// 检查重叠异步结果,如果失败,则和新的客户端重建链接。不然,和客户端处理读写过程
//ZeroMemory(&oneOvlap,sizeof(OVERLAPPED));
//oneOvlap.hEvent = oneEvent;

if (GetOverlappedResult(onePipeHandles,&oneOvlap,&BytesTransferred,TRUE) == 0)
{
_tprintf(_T("GetOverlapped result failed %d start over\n"), GetLastError());
if (DisconnectNamedPipe(onePipeHandles) == 0)
{
_tprintf(_T("DisconnectNamedPipe failed with error %d\n"), GetLastError());
return 0;
}

if (ConnectNamedPipe(onePipeHandles,&oneOvlap) == 0)
{
if( GetLastError() != ERROR_IO_PENDING)
{
_tprintf(_T("ConnectNamedPipe for pipe failed with error %d\n"), GetLastError());
CloseHandle(onePipeHandles);
}
}
}
else
{
ZeroMemory(&oneOvlap,sizeof(OVERLAPPED));
oneOvlap.hEvent = oneEvent;
memset(Buffer,0,BUFFER_SIZE);

//BytesRead = 0;
if(ReadFile(onePipeHandles,Buffer,COUNT_TO_READ,&BytesRead,&oneOvlap) == 0)
{
if (GetLastError() == ERROR_IO_PENDING)
{
_tprintf(_T("ReadFile ------------------ ERROR_IO_PENDING \n"));
}
else if (GetLastError() == ERROR_BROKEN_PIPE) //管道关闭
{
_tprintf(_T("ReadFile result failed %d start over\n"), GetLastError());
if (DisconnectNamedPipe(onePipeHandles) == 0)
{
_tprintf(_T("DisconnectNamedPipe failed with error %d\n"), GetLastError());
return 0;
}

if (ConnectNamedPipe(onePipeHandles,&oneOvlap) == 0)
{
if( GetLastError() != ERROR_IO_PENDING)
{
_tprintf(_T("ConnectNamedPipe for pipe failed with error %d\n"), GetLastError());
CloseHandle(onePipeHandles);
}
}
}
else
{
_tprintf(_T("ReadFile failed with error %d\n"),GetLastError());
}
}
else
{
//memcpy(Buffer+OneRecv,Buffer,BytesRead);
OneRecv += BytesRead;
TotalRecv += BytesRead;
TotalRecv1 += BytesTransferred;

LogFile(THCAR2char(Buffer));

_tprintf(_T("%d ReadFile ------------------ BytesRead = %d,Buffer = %s\n"),nIndex,BytesRead,Buffer);
// 暂时去掉
if (BytesRead > COUNT_TO_READ)
{
_tprintf(_T("%d ReadFile ------------------ BytesRead = %d,Buffer = %s\n"),nIndex,BytesRead,Buffer);
OneRecv = 0;
memset(Buffer,0,sizeof(Buffer));
nIndex ++ ;
}
}
_tprintf(_T("GetOverlapped result BytesTransferred = %d \n"), BytesTransferred);
_tprintf(_T("ReadFile ------------------ TotalRecv = %d\n"),TotalRecv);
_tprintf(_T("ReadFile ------------------ TotalRecv1 = %d\n"),TotalRecv1);
}
}
...全文
125 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧