首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

epoll et send 这样写有什么有关问题

2013-06-25 
epoll et send 这样写有什么问题?BOOL CNetCore_TCPEPoll::NetCore_TCPEPoll_SendMsg(LPCTSTR lpszSendAdd

epoll et send 这样写有什么问题?


BOOL CNetCore_TCPEPoll::NetCore_TCPEPoll_SendMsg(LPCTSTR lpszSendAddr,LPCTSTR lpszSendMsg,int nMsgLen)
{
    NetCore_IsErrorOccur = FALSE;
    NETCORE_TCPEPOLL_CLIENT st_NetClient;
    memset(&st_NetClient,'\0',sizeof(st_NetClient));
    //首先获取地址的SOCKET句柄
    if (!NetCore_TCPEPoll_GetSocketForAddr(lpszSendAddr,&st_NetClient))
    {
        return FALSE;
    }
    int nSend = nMsgLen;
    int nSendLeft = nMsgLen;
    int nSendCount = 0;

    while (TRUE)
    {
        if (!m_NetSocket.NetCore_Socket_Send(st_NetClient.m_Socket,&lpszSendMsg[nSendCount],&nSend))
        {
            if (ERROR_NETENGINE_NETCORE_SOCKET_SEND_LEN != NetCore_dwErrorCode)
            {
                return FALSE;
            }
            nSendCount += nSend;
            nSendLeft -= nSend;
            nSend = nSendLeft;
        }
        else
        {
            break;
        }
    }
    ullFlowUp += nSendCount;
    return TRUE;
}

BOOL CNetCore_Socket::NetCore_Socket_Send(SOCKET hSocket,LPCTSTR lpszSendMsg,int *pInt_MsgLen,int nTimedOut)
{
    NetCore_IsErrorOccur = TRUE;

    int nRet = 0;

    if (SOCKET_ERROR == (nRet = send(hSocket,lpszSendMsg,size_t((*pInt_MsgLen)),0)))
    {
        if (EAGAIN == errno)
        {
            if (nTimedOut > 0)
            {
                Sleep(nTimedOut);       //等待多少毫秒后使用迭代
                return NetCore_Socket_Send(hSocket,lpszSendMsg,pInt_MsgLen,0);
            }
            NetCore_IsErrorOccur = TRUE;
            NetCore_dwErrorCode = ERROR_NETENGINE_NETCORE_SOCKET_SEND_ISFULL;
            return FALSE;
        }
        if (ECONNRESET == errno)


        {
            NetCore_IsErrorOccur = TRUE;
            NetCore_dwErrorCode = ERROR_NETENGINE_NETCORE_SOCKET_SEND_ISCLOSED;
            return FALSE;
        }
        NetCore_IsErrorOccur = TRUE;
        NetCore_dwErrorCode = ERROR_NETENGINE_NETCORE_SOCKET_SEND_ISFAILED;
        return FALSE;
    }

    if (nRet != *pInt_MsgLen)
    {
        NetCore_IsErrorOccur = TRUE;
        NetCore_dwErrorCode = ERROR_NETENGINE_NETCORE_SOCKET_SEND_LEN;
        return FALSE;
    }
    return TRUE;
}



我看到网上说要一直处理到send 返回 EAGAIN 才算OK,非阻塞的。不是在EPOLLOUT里面处理的发送 直接提取出来单独写的。
我要怎么处理EAGAIN 错误,在什么地方处理?
发送的时候就算返回大于0 对方有时候也是收不到的,我抓包看都没发出去。。。我发送哪儿做错了?
[解决办法]
不要用ET。

热点排行