当前位置:  技术问答>linux和unix

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

    来源: 互联网  发布时间:2017-04-08

    本文导语:  BOOL CNetCore_TCPEPoll::NetCore_TCPEPoll_SendMsg(LPCTSTR lpszSendAddr,LPCTSTR lpszSendMsg,int nMsgLen) {     NetCore_IsErrorOccur = FALSE;     NETCORE_TCPEPOLL_CLIENT st_NetClient;     memset(&st_NetClient,'',sizeof(st_NetClient));     //首先获取地址的SOCKET句柄  ...


BOOL CNetCore_TCPEPoll::NetCore_TCPEPoll_SendMsg(LPCTSTR lpszSendAddr,LPCTSTR lpszSendMsg,int nMsgLen)
{
    NetCore_IsErrorOccur = FALSE;
    NETCORE_TCPEPOLL_CLIENT st_NetClient;
    memset(&st_NetClient,'',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。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • epoll中epoll_event结构体的含义
  • 第一次用epoll就傻眼,程序报create_epoll error Function not implemented
  • 为Qt添加epoll的高性能I/O复用 qt_eventdispatcher_epoll
  • 请问: 当服务器采用epoll 时,客户端连不上,但若服务器端不用epoll时,也连上并发消息,这是为什么啊
  • epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &event)为何老返回-1
  • epoll 退出
  • 关于epoll的几个疑问
  • 有人碰到过epoll丢信号吗
  • epoll模型如何限制最大连接数
  • python实现Linux异步epoll代码
  • epoll多路复用模型的疑惑,请高手解答
  • epoll,socket超时如何设置?
  • linux并发服务器中epoll+多线程分别怎么理解?
  • 关于epoll的链接库
  • 谁能解释一下epoll、libevent、zeroMQ的区别?
  • epoll 丢事件
  • 我已经升级内核到2.6,但是为什么还是不能用epoll?
  • int epoll_create(int size) size参数的含义
  • 使用 epoll或poll ,如何确定 与客户端的链接断开 ?
  • 最近在看EPOLL。。。。


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,