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

建网站公司哪个比较好下载asp网站

建网站公司哪个比较好,下载asp网站,杭州网站提升排名,龙文国土局漳滨村新农村建设网站socket的阻塞模式和非阻塞模式 无论是Windows还是Linux,默认创建socket都是阻塞模式的 在Linux中,可以再创建socket是直接将它设置为非阻塞模式 int socket (int __domain, int __type, int __protocol)将__type增加SOCK_NOBLOCK 不仅如此,在Linux上直接利用accept函数返回…socket的阻塞模式和非阻塞模式 无论是Windows还是Linux,默认创建socket都是阻塞模式的 在Linux中,可以再创建socket是直接将它设置为非阻塞模式 int socket (int __domain, int __type, int __protocol)将__type增加SOCK_NOBLOCK 不仅如此,在Linux上直接利用accept函数返回的代表与客户端通信的socket也提供了一个拓展函数accept4,直接将accept4返回的socket设置为非阻塞的 send和recv函数在阻塞和非阻塞模式下的表现 send和recv函数并不是直接向网络上发送数据和接收数据 send函数是将应用层发送缓冲区的数据拷贝到内核缓冲区中 recv函数是将内核缓冲区的数据拷贝到应用缓冲区 可以用下面这张图来描述: 通过上图我们可以知道,不同的程序进行网络通信时,发送的一方会将内核缓冲区的数据通过网络传输给接收方的内核缓冲区。 在应用程序A与应用程序B建立TCP连接后,假设A不断调用send函数,会将数据不断拷贝到对应的内核缓冲区,如果应用程序不调用recv函数,那么在应用程序B的内核缓冲区被填满后,A的缓冲区也随后被填满,此时如果A继续调用send函数会有什么后果呢? 当socket处于阻塞模式时,继续调用send/recv函数,程序会阻塞在send/recv调用处当socket处于非阻塞模式时,继续调用send/recv函数,会返回错误码 socket阻塞模式下send函数的表现 代码来自《C服务器开发精髓》 服务端代码: #include sys/types.h #include sys/socket.h #include arpa/inet.h #include unistd.h #include iostream #include string.hint main(int argc, char* argv[]) {//1.创建一个侦听socketint listenfd socket(AF_INET, SOCK_STREAM, 0);if (listenfd -1){std::cout create listen socket error. std::endl;return -1;}//2.初始化服务器地址struct sockaddr_in bindaddr;bindaddr.sin_family AF_INET;bindaddr.sin_addr.s_addr htonl(INADDR_ANY);bindaddr.sin_port htons(3000);if (bind(listenfd, (struct sockaddr *)bindaddr, sizeof(bindaddr)) -1){std::cout bind listen socket error. std::endl;close(listenfd);return -1;}//3.启动侦听if (listen(listenfd, SOMAXCONN) -1){std::cout listen error. std::endl;close(listenfd);return -1;}while (true){struct sockaddr_in clientaddr;socklen_t clientaddrlen sizeof(clientaddr);//4. 接受客户端连接int clientfd accept(listenfd, (struct sockaddr *)clientaddr, clientaddrlen);if (clientfd ! -1){ //只接受连接不调用recv收取任何数据std:: cout accept a client connection. std::endl;}}//7.关闭侦听socketclose(listenfd);return 0; } 客户端代码: /*** 验证阻塞模式下send函数的行为client端* zhangyl 2018.12.17*/ #include sys/types.h #include sys/socket.h #include arpa/inet.h #include unistd.h #include iostream #include string.h#define SERVER_ADDRESS 127.0.0.1 #define SERVER_PORT 3000 #define SEND_DATA helloworldint main(int argc, char* argv[]) {//1.创建一个socketint clientfd socket(AF_INET, SOCK_STREAM, 0);if (clientfd -1){std::cout create client socket error. std::endl;return -1;}//2.连接服务器struct sockaddr_in serveraddr;serveraddr.sin_family AF_INET;serveraddr.sin_addr.s_addr inet_addr(SERVER_ADDRESS);serveraddr.sin_port htons(SERVER_PORT);if (connect(clientfd, (struct sockaddr *)serveraddr, sizeof(serveraddr)) -1){std::cout connect socket error. std::endl;close(clientfd);return -1;}//3. 不断向服务器发送数据或者出错退出int count 0;while (true){int ret send(clientfd, SEND_DATA, strlen(SEND_DATA), 0);if (ret ! strlen(SEND_DATA)){std::cout send data error. std::endl;break;} else{count ;std::cout send data successfully, count count std::endl;}}//5. 关闭socketclose(clientfd);return 0; } 先启动server在启动client,客户端会不断向服务端发送helloworld,每次发送成功后会打印计数器,运行一顿时间后,停止打印,计数器不再增加 当程序不再有输出,说明阻塞在某个函数gdb看一看 (gdb) bt #0 0x00007ffff7d03690 in __libc_send (fd3, buf0x555555556045, len10, flags0) at ../sysdeps/unix/sysv/linux/send.c:28 #1 0x00005555555553bb in main (argc1, argv0x7fffffffdf28) at client.cpp:42 (gdb) 果然是send函数 上面这个例子证明了如果一端一直发送数据,另一端不接收数据,内核缓冲区很快就会被填满,发生阻塞. 其实这里所说的内核缓冲区就是TCP窗口 我们现在利用tcpdump工具查看一下这种情况下TCP窗口的大小 22:01:57.543364 IP 127.0.0.1.53382 127.0.0.1.3000: Flags [S], seq 1832090129, win 65495, options [mss 65495,sackOK,TS val 451488646 ecr 0,nop,wscale 7], length 0 22:01:57.543379 IP 127.0.0.1.3000 127.0.0.1.53382: Flags [S.], seq 1797517498, ack 1832090130, win 65483, options [mss 65495,sackOK,TS val 451488646 ecr 451488646,nop,wscale 7], length 0 22:01:57.543386 IP 127.0.0.1.53382 127.0.0.1.3000: Flags [.], ack 1797517499, win 512, options [nop,nop,TS val 451488646 ecr 451488646], length 0 ... 22:02:11.342670 IP 127.0.0.1.3000 127.0.0.1.53382: Flags [.], ack 1832177322, win 0, options [nop,nop,TS val 451502445 ecr 451488936], length 0 win就是TCP窗口的大小可以看出,逐渐减小最后变为零 socket非阻塞模式下send函数的表现 就是返回一个错误码,不阻塞了,略… socket阻塞模式下recv函数的表现 阻塞了就… socket非阻塞模式下recv函数的表现 recv在没有数据可读的情况下,会立即返回,返回值为-1 非阻塞模式下send和recv函数返回值总结 返回值n含义大于0成功发送或接受n字节等于零对方关闭连接小于零出错,被信号中断,TCP窗口太小导致数据发送不出去,或者当前网卡缓冲区已经无数据可以接受 详细介绍: 返回值大于0 当send和recv函数返回值大于0时,表示发送或者接收多少字节.需要注意的是,在这种情况下,**判断send返回值是否等于要发送的字节数,而不是简单地判断返回值是否大于零 int n send(socketfd,buf,buf_length,0);if (n0){printf(send successfully);}很多新手就会写出以上的代码(比如我…)虽然返回值大于零,但由于对端TCP窗口已满,搜易我们所期望发送的字节,并没有全部被对方接收,所以n的大小在区间(0,buf_length)内 解决办法: 在返回值等于buf_length时才认为正确在一个循环中调用send函数,如果一次性发送不完,记录偏移量,接着从偏移量处发送 返回值等于0 对端关闭了连接特殊情况:send函数主动发送了0字节 小于零 出错啦呗 TCP网络编程的基本流程 Linux与C11多线程编程(学习笔记) Linux select函数用法和原理 socket的阻塞模式和非阻塞模式(send和recv函数在阻塞和非阻塞模式下的表现) connect函数在阻塞和非阻塞模式下的行为 获取socket对应的接收缓冲区中的可读数据量
http://www.huolong8.cn/news/205046/

相关文章:

  • 行业网站建设教程wordpress 4.7.3主题
  • 校园网站建设情况统计表自己做网站详细流程
  • 手机微网站制作系统站群 wordpress
  • 缩短链接网站做网站诊断步骤
  • 衡阳购物网站开发案例线上营销培训
  • 建立网站需要什么软件个人网站开发平台有哪些
  • wap网站建设服务jsp网站开发平台
  • 移动网站打不开解决办法网站制作设计收费标准
  • 威海 网站建设怎样做网站公司
  • 班服定制的网站外贸网站seo教程
  • 广州开发区科技企业加速器seo快速提升排名
  • 重庆哪家公司做网站好创建个人网站教案
  • 有彩虹代刷源码怎么做网站网站内容描述
  • 做网站iiwok外贸收款平台有哪些
  • 为什么招聘网站做不大网址生成短链接
  • 网站开发 技术支持服务协议北京it外包服务商
  • 网站建设拟解决问题企业seo顾问公司
  • 网站备案的坏处购物网站建设方案书
  • 济源市建设工程管理处网站高端品牌网站设计公司价格
  • 医院网站建设方案书网站logo在哪里修改
  • 商城网站开发dw做网站详细教程
  • hpsocket 网站开发高水平的锦州网站建设
  • 一级a做爰片免费网站 新闻凡科删除建设的网站
  • 网站建设公司未来发展方向网站超链接
  • 品牌网站建设策划方案怎样做站长建网站
  • 美食网站的建设背景it互联网培训机构排名
  • 房地产开发公司网站建设方案模板银川网站推广方式
  • 网站设置访问密码wordpress开启gzip压缩
  • 怎样快速学好网站建设在云服务器上搭建网站
  • 怎么做网站背景厦门建设服务管理中心网站