当前位置: 首页 > news >正文

成都手机号码销售网站建设制作网站协议

成都手机号码销售网站建设,制作网站协议,网站qq登录原理,不用网站怎么做落地页一、非阻塞socket 非阻塞套接字是指执行此套接字的网络调用时#xff0c;不管是否执行成功#xff0c;都立即返回。比如调用recv()函数读取网络缓冲区中数据#xff0c;不管是否读到数据都立即返回#xff0c;而不会一直挂在此函数调用上。在实际Windows网络通信软件开发中…一、非阻塞socket 非阻塞套接字是指执行此套接字的网络调用时不管是否执行成功都立即返回。比如调用recv()函数读取网络缓冲区中数据不管是否读到数据都立即返回而不会一直挂在此函数调用上。在实际Windows网络通信软件开发中异步非阻塞套接字是用的最多的。平常所说的C/S客户端/服务器结构的软件就是异步非阻塞模式的。 int32_t flags fcntl(socket_fd, F_GETFL, 0);     fcntl(socket_fd, F_SETFL, flags | O_NONBLOCK); 二、EAGAIN错误        当应用程序在socket中设置O_NONBLOCK属性后如果发送缓存被占满send就会返回EAGAIN或EWOULDBLOCK的错误。在将socket设置O_NONBLOCK属性后通过socket发送一个100K大小的数据第一次成功发送了13140数据之后继续发送并未成功errno数值为EAGAIN错误。 三、EPOLL模式下EAGAIN错误处理方式         方法需要封装socket_send()的函数用来处理这种情况,该函数会尽量将数据写完再返回返回发送的字节数。在socket_send()内部,当写缓冲已满(send()返回-1,且errno为EAGAIN)那么会等待后再重试。 int32_t socket_send(int fd, char* data, int32_t size)     {         if (NULL data || size 0)         {             return -1;         }         int32_t remainded size;         int32_t sended 0;         char* pszTmp data;         while(remainded 0)         {             sended send(fd, pszTmp, (size_t)remainded, 0);             if (sended 0)             {                 pszTmp sended;                 remainded - sended;             }             else if (errno EAGAIN)             {                 continue;             }             else             {                break;             }         }         return (size - remainded);     } 这种方式并不很完美当发送大数据的时候如果客户端一直不调用recv函数接受数据那么服务器就会卡死在while循环中持续调用send函数返回EAGAIN错误。对服务器来说出现这种情况是致命的届时服务器的所有功能都不能正常运转。        如果当send函数出现EAGAIN错误的时候直到当前socket状态变成可写之前不应该继续调用send函数发送数据。在发送数据之前将socket的监听的事件增加EPOLLOUT在数据全部发送之后再取消EPOLLOUT的监听。        socket监听EPOLLOUT代码 void epoll_event_mod(int epoll_socket_fd, int fd)     {         struct epoll_event epollEvent;         memset(epollEvent, 0x0, sizeo(epollEvent));         epollEvent.data.fd fd;         epollEvent.events EPOLLIN | EPOLLERR | EPOLLHUP | EPOLLOUT;         epollEvent.data.ptr NULL;         epoll_ctl(epoll_socket_fd, EPOLL_CTL_MOD, fd, m_epoll_event);     } socket缓存结构体代码 struct stSocketBuffer     {         int32_t m_iHead;         int32_t m_iTail;         char     m_szBuffer[max_socket_buffer_size];     }; socket待发送数据放入缓存结构代码 int32_t push_socket_data(int fd, char* data, int32_t size)     {         if (NULL data || size 0)         {             return -1;         }         stSocketBuffer* pstBuffer get_socket_buffer(fd);         if (NULL pstBuffer)         {             return -2;         }         if ( size max_socket_buffer_size m_iHead - m_iTail)         {             return -3;         }         if (size m_iTail max_socket_buffer_size)         {             memcopy(pstBuffer-m_szBuffer[0], pstBuffer-m_szBuffer[pstBuffer-m_iHead], pstBuffer-m_iTail  - pstBuffer-m_iHead);             pstBuffer-m_iTail - pstBuffer-m_iHead;             pstBuffer-m_iHead 0;         }         memcpy(pstBuffer-m_szBuffer[pstBuffer-m_iTail], data, size);         pstBuffer-m_iTail size;         return 0;     } 将缓存区数据发送出去代码 int32_t socket_send(int fd)     {         stSocketBuffer* pstBuffer get_socket_buffer(fd);         if (NULL pstBuffer)         {             return -1;         }               int32_t remainded pstBuffer-m_iTail - pstBuffer-m_iHead;         int32_t sended 0;         char* pszTmp pstBuffer-m_szBuffer[pstBuffer-m_iHead];         int32_t again_count 0;         while(remainded 0 again_count 2)         {             sended send(fd, pszTmp, (size_t)remainded, 0);             if (sended 0)             {                 pstBuffer-m_iHead sended;                 pszTmp sended;                 remainded - sended;             }             else if (errno EAGAIN)             {                 again_count;                 continue;             }             else             {                 break;             }         }         return (size - remainded);     } 总结当需要向socket发送数据时现将数据压入发送缓存区stSocketBuffer结构体中并且将socket加入可写事件监听。当socket触发可写事件EPOLLOUT时调用socket_send函数发送数据所有数据发送完毕再清除EPOLLOUT事件。
http://www.zqtcl.cn/news/220772/

相关文章:

  • 网站开发u盘128够吗网站建设是固定资产嘛
  • 网站域名备案信息wordpress搜索文章内容
  • 出口退税在哪个网站做怎么在一起做网站上拿货
  • 网站友链查询传到网站根目录
  • 网站服务器端口设置北京专业网络直播制作
  • 可以免费做演播的听书网站南京企业自助建站
  • 软件下载类型网站怎么做长沙官网优化技术
  • 药品网站订单源码外贸网站建设服务器
  • 深圳网站制作07551免费开发网站
  • 如何直接用jsp做网站不写servletwordpress模板 单栏
  • 长沙网站建设哪个公司好设计公司网站 唐山
  • 原创小说手机网站制作需要多少钱郴州seo外包
  • 深圳市大鹏建设局网站网站关键词没排名怎么办
  • 水果商城网站制作多少钱c#如何做公司网站
  • 国内做进口的电商网站网站建设的经验做法
  • 蚂蚁搬家公司官方网站免费网站软件制作
  • 搭建网站要用到的工具外链代发免费
  • 肥城网站建设流程oem中国代加工网
  • 到底建手机网站还是电脑网站网站视频怎么做
  • 小区网站建设前端手机网站
  • 做一个网站价格WordPress好看的404
  • 查看注册过的网站在线网站软件免费下载
  • 门户网站建设公司价位域名出售网站
  • 亿级流量网站架构自己制作一个网站
  • 企业网站seo成功案例天津网站建设制作品牌公司
  • 衡水做网站电话郏县建设局网站
  • 美工做网站尺寸多少钱怎么做网站免费的
  • 会计信息系统网站建设流程图手机网站图片宽度
  • 已备案网站增加域名wordpress 百度熊掌号
  • 网站建设维护课件ppt百度搜索一下百度