学的时间不长。
我想要做一个Server阻塞方式的,这个需要一直打开,除非停电。
然后做Client,和Server连接。我开始时采取,一次连接之后就把Server重启,就是重新做Socket,然后Bind之类的。然后现在我想做改进,就是让Server一直开,一直处于Accept的状态,然后Recv或Send。。
但是当Client在还没有Send或Recv结束突然断掉,那Server就死掉了,因为用的是阻塞的方式。谁给点思路,或者代码之类的。
我不知道该怎么做。是阻塞方式的,因为这个比较简单。

解决方案 »

  1.   

    Accept后,新开一个线程,将接收到的socket句柄传递到一个线程中来处理
      

  2.   

    开了线程之后,假如Client突然中断了呢。
    那样Client就连接不上了啊。
    那样怎么Client已经断开了啊?
      

  3.   

    服务器怎么判断Client已经和我断开了呢?
      

  4.   

    发送心跳包过去,如果断开,会返回发送失败,根据WSAGetLastError的值进行判断
      

  5.   

    Accept在一个单独的线程里,接收到每个连接都开启一个线程来处理,在线程里调用recv函数等待读取客户端数据,如果客户端断开,则recv会返回,退出线程即可;如果服务器存在主动关闭客户端的情况,那么就需要一个数组来存储Accept后的句柄,然后需要关闭的时候,就遍历这个数组找到句柄关闭即可
    不知道这样说是否足够明白?
      

  6.   

    明白,就是不太明白怎么做。
    有点眼高手低。
    要是在accept的时候断开呢?
      

  7.   


    int CBaseSocket::SendData(char pBuf[],int iLength)//发送数据
    {
    int nLeft=iLength;
    int nIndex=0;
    BOOL bResult=TRUE;
    while (nLeft > 0)
    {
    int nRet=send(m_socket,pBuf+nIndex,nLeft,0);
    if (SOCKET_ERROR == nRet || WSAETIMEDOUT ==nRet)
    {
    int err=WSAGetLastError();
    TRACE1("socket send data error is %d",err);
    TRACE0("socket send data error");
    if (err==10053 || err==10054)       // 连接已断开
    {
    ReConnect();
    return FALSE;
    }
    bResult=FALSE;
    break;
    }
    nIndex += nRet;
    nLeft -= nRet;
    }
    return bResult;
    }
      

  8.   

    可以把你的这个工程发给我看看么?
    我邮箱[email protected]
    动手的时候发现好多东西真不知道怎么写