网络编程(2)Socket同步非阻塞工作模式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了网络编程(2)Socket同步非阻塞工作模式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3458字,纯文字阅读大概需要5分钟。
内容图文
同步非阻塞模式比前面说的那个同步阻塞模式要高些,虽然高得有限.在这种模式下,send或recv函数会设为MSG_DONTWAIT, 即非阻塞,即便没有,就略过继续做后面的事。比如有多个socket时,可以去查看其他socket有没有可以接收的数据。然后再反复检查前面的执行
同步非阻塞模式比前面说的那个同步阻塞模式要高些,虽然高得有限.在这种模式下,send或recv函数会设为MSG_DONTWAIT,
即非阻塞,即便没有值,就略过继续做后面的事。比如有多个socket时,可以去查看其他socket有没有可以接收的数据。然后再反复检查前面的执行情况,直到有数据为止。
这种模式优点是不阻塞了,但消耗的系统资源太多,因为它要不停的去检查,做了很多没有必要的调用。一。Socket客户端例子
所用到的头文件在 网络编程(1)跨平台的Socket同步阻塞工作模式例子 中有.
代码如下:
/************************************************* Author: xiongchuanliang Description: 同步非阻塞工作模式例子_客户端代码 编译命令: Linux: g++ -o tcpclientnoblk tcpclientnoblk.cpp -m64 -I./common **************************************************/ // 客户端代码 #include#include #include #include "initsock.h" #include "common.h" int main(int argc, char* argv[]) { int sclient = 0; //连接服务端的套接字 int flags = 0; //fcntl返回标识 int recvbytes = 0; //服务端返回的数据长度 char recvData[MAXDATASIZE] = {0}; //保存服务端返回的数据 //取出传入参数 const size_t MaxLen = 500; char testMsg[MaxLen]={0}; if(argc < 3) { printf("Usage:%s [ip address] [any string]\n",argv[0]); exit(EXIT_FAILURE); }else{ strncpy(testMsg,argv[2],strlen(argv[2])); printf("Message: %s \n",testMsg); } //建立套接字 sclient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(sclient == INVALID_SOCKET) { PrintError("invalid() failed"); exit(EXIT_FAILURE); } //指定要连接的服务器地址和端口 struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(SERVPORT); inet_pton(AF_INET, argv[1], &server_addr.sin_addr); //用户输入的ip参数 memset(&(server_addr.sin_zero),0,8); //设为非阻塞模式 //方法一: flags = fcntl(sclient, F_GETFL, 0); //得到套接字描述符标识位 if(flags < 0) { PrintError("fcntl() failed"); exit(EXIT_FAILURE); } fcntl(sclient, flags|O_NONBLOCK); // 更改套接字描述符标识位 //方法二: // #include // #include <sys/ioctl.h> // ioctl(sclient,FIONBIO,&flags); //将套接字连接上服务器 if( connect(sclient,(struct sockaddr *)&server_addr,sizeof(struct sockaddr) ) == -1) { PrintError("connect() failed"); exit(EXIT_FAILURE); } //同步非阻塞模式--发送数据到服务端 while(send(sclient,testMsg,strlen(testMsg),MSG_DONTWAIT) == -1) { sleep(10); printf("send() sleep(10)\n"); } printf("send success!\n"); //同步非阻塞模式--接收返回的数据 while( (recvbytes = recv(sclient,recvData,MAXDATASIZE,MSG_DONTWAIT)) == -1) { sleep(10); printf("recv() sleep(10)\n"); } printf("recv success!\n"); if( recvbytes == 0) { printf("recv() no data!\n"); }else if( recvbytes < 0) { PrintError("recv() failed"); }else { recvData[recvbytes]='\0'; printf("recv:%s\n",recvData); } //关闭套接字,结束此次TCP会话 close(sclient); exit(EXIT_SUCCESS); }
二。总结
设为非阻塞模式,主要就是更改Socket的属性。并设置 MSG_DONTWAIT.
更改Socket属性提供了两种方法:
方法一:
flags = fcntl(sclient, F_GETFL, 0); //得到套接字描述符标识位 if(flags < 0) { PrintError("fcntl() failed"); exit(EXIT_FAILURE); } fcntl(sclient, flags|O_NONBLOCK); // 更改套接字描述符标识位
方法二:
#include#include <sys/ioctl.h> ioctl(sclient,FIONBIO,&flags);
同时,在代码中,可以看到send和recv都放在while中,不停的检查返回值。效率并不高。
MAIL: xcl_168@aliyun.com
BLOG:http://blog.csdn.net/xcl168
内容总结
以上是互联网集市为您收集整理的网络编程(2)Socket同步非阻塞工作模式全部内容,希望文章能够帮你解决网络编程(2)Socket同步非阻塞工作模式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。