我下了个 完成端口的例子,服务器可以接收 客户端的连接和 数据, 但向客户端发数据就不成功了,各位大大帮我看看。//缓冲区对象
struct IOCPBUFFER
{
WSAOVERLAPPED ol; //重叠I/O
SOCKET sClient; //新收到的客户端 (只对Listen套接字有效)
char *buf; //缓冲区指针
int nLen; //buf的长度
ULONG nSequenceNumber; //当前对象的序列号
int nOperationType; //操作类型 :OP_ACCEPT,OP_RECV ,OP_SEND
IOCPBUFFER *pNext; //指向下一个IOCPBUFFER
};//客户上下文对象
struct IOCPCONTEXT
{
SOCKET s; //套接字句柄
sockaddr_in addrLocal; //连接的本地地址
sockaddr_in addrRemote;//连接的远程地址
int nOutstandingRecv; //此套接字上被抛出的重叠操作数量(recv)
int nOutstandingSend; //此套接字上被抛出的重叠操作数量 (send)
ULONG nReadSequence; //安排给接收下一个序列号
ULONG nCurrentSequence;//当前要读的序列号
CRITICAL_SECTION lock; //保护这个结构锁
IOCPBUFFER *pOutofOrederReads; //记录没有按顺序完成的读I/O
IOCPCONTEXT *pNext; //指向下一个IOCPCONTEXT
};发送代码
BOOL IOCPServer::WriteDate(char *buf, int len, IOCPCONTEXT *pContext)
{
IOCPBUFFER *pBuffer=this->AllocBuffer(BUFFER_SIZE);
if(pBuffer!=NULL)
{
::memcpy(pBuffer->buf,buf,len);
if(this->PostSend(pBuffer,pContext))
{
return true;
}
}
return false;
}bool IOCPServer::PostSend(IOCPBUFFER* pBuffer, IOCPCONTEXT* pContext)
{ send(pContext->s,"aaaaa",6,0); //自己添加的
pBuffer->nOperationType=OP_SEND;
::EnterCriticalSection(&pContext->lock);
DWORD dwBytes;
DWORD dwFlags=0;
WSABUF buf;
buf.buf=pBuffer->buf;
buf.len=pBuffer->nLen;
if(::WSASend(pContext->s,&buf,1,&dwBytes,dwFlags,&pBuffer->ol,NULL))
{
if(WSA_IO_PENDING!=WSAGetLastError())
{
::LeaveCriticalSection(&pContext->lock);
return false;
}
}
pContext->nOutstandingSend++;
::LeaveCriticalSection(&pContext->lock); return true;
}
我在 接收数据的地方 向客户端 回发数据
MyServer 继承的 IOCPServer void MyServer::CompletedRecvDate(IOCPBUFFER* pBuffer, IOCPCONTEXT* pContext)
{
WriteDate("abcd",4,pContext);
}
但如果不在 PostSend 加 send(pContext->s,"aaaaa",6,0); 总是回发不了数据。
有人能帮帮我吗?谢谢。 我对完成端口不了解,以前没用过。
struct IOCPBUFFER
{
WSAOVERLAPPED ol; //重叠I/O
SOCKET sClient; //新收到的客户端 (只对Listen套接字有效)
char *buf; //缓冲区指针
int nLen; //buf的长度
ULONG nSequenceNumber; //当前对象的序列号
int nOperationType; //操作类型 :OP_ACCEPT,OP_RECV ,OP_SEND
IOCPBUFFER *pNext; //指向下一个IOCPBUFFER
};//客户上下文对象
struct IOCPCONTEXT
{
SOCKET s; //套接字句柄
sockaddr_in addrLocal; //连接的本地地址
sockaddr_in addrRemote;//连接的远程地址
int nOutstandingRecv; //此套接字上被抛出的重叠操作数量(recv)
int nOutstandingSend; //此套接字上被抛出的重叠操作数量 (send)
ULONG nReadSequence; //安排给接收下一个序列号
ULONG nCurrentSequence;//当前要读的序列号
CRITICAL_SECTION lock; //保护这个结构锁
IOCPBUFFER *pOutofOrederReads; //记录没有按顺序完成的读I/O
IOCPCONTEXT *pNext; //指向下一个IOCPCONTEXT
};发送代码
BOOL IOCPServer::WriteDate(char *buf, int len, IOCPCONTEXT *pContext)
{
IOCPBUFFER *pBuffer=this->AllocBuffer(BUFFER_SIZE);
if(pBuffer!=NULL)
{
::memcpy(pBuffer->buf,buf,len);
if(this->PostSend(pBuffer,pContext))
{
return true;
}
}
return false;
}bool IOCPServer::PostSend(IOCPBUFFER* pBuffer, IOCPCONTEXT* pContext)
{ send(pContext->s,"aaaaa",6,0); //自己添加的
pBuffer->nOperationType=OP_SEND;
::EnterCriticalSection(&pContext->lock);
DWORD dwBytes;
DWORD dwFlags=0;
WSABUF buf;
buf.buf=pBuffer->buf;
buf.len=pBuffer->nLen;
if(::WSASend(pContext->s,&buf,1,&dwBytes,dwFlags,&pBuffer->ol,NULL))
{
if(WSA_IO_PENDING!=WSAGetLastError())
{
::LeaveCriticalSection(&pContext->lock);
return false;
}
}
pContext->nOutstandingSend++;
::LeaveCriticalSection(&pContext->lock); return true;
}
我在 接收数据的地方 向客户端 回发数据
MyServer 继承的 IOCPServer void MyServer::CompletedRecvDate(IOCPBUFFER* pBuffer, IOCPCONTEXT* pContext)
{
WriteDate("abcd",4,pContext);
}
但如果不在 PostSend 加 send(pContext->s,"aaaaa",6,0); 总是回发不了数据。
有人能帮帮我吗?谢谢。 我对完成端口不了解,以前没用过。
解决方案 »
- 为什么在Docment类中调用CTreeView类中函数没用,执行时返回NULL:比如CTreeCtrl.InsertItem()。而直接在CTreeView类中调用才有用
- 怎么样把int型该为LPCTSTR形
- 服务端数据收不全而出错
- vc的迷惑?
- CRect m_pos(2,2,0,0) 是个什么意思?
- 后天见导师搞图像处理和模式识别的,准备什么?
- 请高手指教!
- 问个算法问题:拆成4个16进制数,如何重新拼接成double数?
- 提问:关于IE5.5 和I5.0的内部机制问题!
- 只剩97分了,请帮忙:怎样减慢wav文件的播放速度?该怎样插值?=====————
- VC 如何实现一张图片上各个按扭图标自动加载
- 求把4位16色转成256色详细代码
BOOL IOCPServer::WriteDate(char *buf, int len, IOCPCONTEXT *pContext)
{
IOCPBUFFER *pBuffer=this->AllocBuffer(BUFFER_SIZE);
if(pBuffer!=NULL)
{
//加上这两句看
pBuffer->buf = new char[len];
pBuffer->nLen = len;
::memcpy(pBuffer->buf,buf,len); if(this->PostSend(pBuffer,pContext))
{
return true;
}
}
return false;
}