客户端连接后可以向服务端发送消息,但是发送后要想再次发送,就必须再次进行连接操作,有什么方法可以保持连接呢?

解决方案 »

  1.   

    第一、你使用的是什么方式的连接?tcp?
    第二、服务器收到数据后是否断开了连接?把你服务器接收和客户端发送的代码贴出来看看
      

  2.   


    是TCP接收函数
    BOOL accept2()
    {
    SOCKET m_ClientSock;
    SOCKADDR_IN ClientAddr;
    int nLen=sizeof(sockaddr);
    if((m_ClientSock=WSAAccept(m_ListenSocket, (sockaddr *)&ClientAddr, &nLen, NULL, NULL))==SOCKET_ERROR)
    return 0; m_AcceptNotify(m_ClientSock, CLIENT_CONNECTED);
    、、通知回调函数 if((PerHandleData=(LPPER_HANDLE_DATA)GlobalAlloc(GPTR, sizeof(PER_HANDLE_DATA)))==NULL)
    return 0; PerHandleData->Socket = m_ClientSock;
    memcpy(&(PerHandleData->SockaddrInfo), &ClientAddr, sizeof(sockaddr));
    if(CreateIoCompletionPort((HANDLE)m_ClientSock, CompletionPort, (DWORD)PerHandleData, 0)==NULL)
    return 0; if((PerIoData=(LPPER_IO_OPERATION_DATA)GlobalAlloc(GPTR, sizeof(PER_IO_OPERATION_DATA)))==NULL)
    return 0; ZeroMemory(&(PerIoData->Overlapped), sizeof(OVERLAPPED));
    PerIoData->DataBuf.len=DATA_SIZE;
    PerIoData->DataBuf.buf=PerIoData->Buffer;
    PerIoData->opterion=OP_READ; DWORD Flags=0;
    DWORD RecvBytes;
    if(WSARecv(m_ClientSock, &(PerIoData->DataBuf), 1, &RecvBytes, &Flags, &(PerIoData->Overlapped), NULL)==SOCKET_ERROR)
    {
    if(WSAGetLastError()!=ERROR_IO_PENDING)
    return 0;
    }
    return 1;
    }发送函数
    BOOL send2(SOCKET s, PBYTE pBuf, int nSize)
    {
    if((PerIoData=(LPPER_IO_OPERATION_DATA)GlobalAlloc(GPTR, sizeof(PER_IO_OPERATION_DATA)))==NULL)
    return 0;

    ZeroMemory(&(PerIoData->Overlapped), sizeof(OVERLAPPED));
    PerIoData->BytesRECV=0;
    PerIoData->BytesSEND=nSize;
    PerIoData->DataBuf.len=nSize;
    PerIoData->DataBuf.buf=(char *)pBuf;
    memcpy(PerIoData->Buffer, pBuf, nSize);
    PerIoData->opterion=OP_WRITE; DWORD RecvBytes;
    if(WSASend(s, &PerIoData->DataBuf, 1, &RecvBytes, 0, &PerIoData->Overlapped, NULL)==SOCKET_ERROR)
    {
    return 0;
    }
    return TRUE;
    }
      

  3.   

    第一,你的WSAAccept的时候只有一个socket(m_ClientSock),你看看你这个socket在什么时候会给释放
    并且你这个socket是已经付给PerHandleData了,看看在啥时候是否有释放第二,你这个模式只有一个客户端连上来吗?现在是不是连上后发送一个消息,客户端就断开了?如果是的话估计是随着PerHandleData给释放掉这个socket了
      

  4.   

    一旦连接后会保持连接的,除非网络掉线,服务端close掉你的socket。
      

  5.   

    好像不是失去连接了 而是被阻塞了1 C->S 成功
    2 S->C 成功
    3 C->S 成功
    4 C->S 失败
    5 S->C 成功 同时返回4中的结果