本帖最后由 bcc222 于 2010-11-11 09:20:46 编辑

解决方案 »

  1.   

    int CSocketBlockClient::ReceiveMsg_C(char *buff)
    {
    char tmp[1024];//没必要使用清1024个0浪费CPU
    int ret=recv(m_hSocket,tmp,1024,0);//问题处
    //if(ret==SOCKET_ERROR)//不是这么判断的
    if (ret <= 0)
    {
    closesocket(m_hSocket);
    return ret;
    }}memcpy(buff,tmp,ret);
    tmp[ret] = 0;//结束符,别忘记了,对于传文本的时候有用.
    return ret;//实际收取的字符数.
    }
      

  2.   

    // select mode 
    #define SELECT_MODE_READY   0x001
    #define SELECT_MODE_WRITE    0x002// select return codes 
    #define SELECT_STATE_READY         0
    #define SELECT_STATE_ERROR         1
    #define SELECT_STATE_ABORTED       2
    #define SELECT_STATE_TIMEOUT       3#ifdef WIN32
        #include <winsock2.h>
        #pragma comment(lib, "ws2_32.lib")
        #pragma warning(disable:4786)
        #pragma warning(disable:4996)
        #define SocketLen int
    #else
        //network
        #include <sys/socket.h>
        #include <netinet/in.h>
        #include <arpa/inet.h>    
        #include <netinet/tcp.h>
        #include <netdb.h>
    #endif
    int CMySocket::BlockReceive(SOCKET sock, LPCSTR pBuffer, int readSize, int nTimeOut)
    {
        int selectState;
        int recvSize;
        
        selectState = Select(sock, SELECT_MODE_READY, nTimeOut);
        if (SELECT_STATE_TIMEOUT == selectState)
            return 0;
        
        if (SELECT_STATE_READY == selectState)
        {
            recvSize = recv(sock, (char*)pBuffer, readSize, 0);
            if (recvSize <= 0)
                return -1;
            return recvSize;
        }
        return -1;
    }
    int CMySocket::BlockSend(SOCKET sock, LPCSTR pBuffer, int writeSize, int nTimeOut)
    {
        int selectState = 0;
        int sendSize = 0;
        
        selectState = Select(sock, SELECT_MODE_WRITE, nTimeOut);
        if (selectState == SELECT_STATE_TIMEOUT)
            return 0;
        
        if (selectState == SELECT_STATE_READY)
        {
            sendSize = send(sock, (char*)pBuffer, writeSize, 0);
            if (sendSize <= 0)
                return -1;
            return sendSize;
        }    
        
        return -1;
    }