我下了个 完成端口的例子,服务器可以接收 客户端的连接和 数据, 但向客户端发数据就不成功了,各位大大帮我看看。//缓冲区对象
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); 总是回发不了数据。
有人能帮帮我吗?谢谢。 我对完成端口不了解,以前没用过。

解决方案 »

  1.   

    ::memcpy(pBuffer->buf,buf,len);我想问一下pBuffer->buf的内存在哪里?
      

  2.   

    发送代码
    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;
    }