linux嵌入式c网络编程,嵌入式Linux网络编程之:网络高级编程

本文引用地址:http://www.eepw.com.cn/article/257115.htm

在实际情况中,人们往往遇到多个客户端连接服务器端的情况。由于之前介绍的如connet()、recv()和send()等都是阻塞性函数,如果资源没有准备好,则调用该函数的进程将进入睡眠状态,这样就无法处理I/O多路复用的情况了。本节给出了两种解决I/O多路复用的解决方法,这两个函数都是之前学过的fcntl()和select()(请读者先复习第6章中的相关内容)。可以看到,由于在Linux中把socket也作为一种特殊文件描述符,这给用户的处理带来了很大的方便。

函数fcntl()针对socket编程提供了如下的编程特性。

n 非阻塞I/O:可将cmd设置为F_SETFL,将lock设置为O_NONBLOCK。

n 异步I/O:可将cmd设置为F_SETFL,将lock设置为O_ASYNC。

下面是用fcntl()将套接字设置为非阻塞I/O的实例代码:

/*net_fcntl.c*/

#includesys/types.h>

#includesys/socket.h>

#includesys/wait.h>

#includestdio.h>

#includestdlib.h>

#includeerrno.h>

#includestring.h>

#includesys/un.h>

#includesys/time.h>

#includesys/ioctl.h>

#includeunistd.h>

#includenetinet/in.h>

#includefcntl.h>

#definePORT1234

#defineMAX_QUE_CONN_NM5

#defineBUFFER_SIZE1024

intmain()

{

structsockaddr_inserver_sockaddr,client_sockaddr;

intsin_size,recvbytes,flags;

intsockfd,client_fd;

charbuf[BUFFER_SIZE];

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)

{

perror(socket);

exit(1);

}

server_sockaddr.sin_family=AF_INET;

server_sockaddr.sin_port=htons(PORT);

server_sockaddr.sin_addr.s_addr=INADDR_ANY;

bzero((server_sockaddr.sin_zero),8);

inti=1;/*允许重复使用本地地址与套接字进行绑定*/

setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,i,sizeof(i));

if(bind(sockfd,(structsockaddr*)server_sockaddr,

sizeof(structsockaddr))==-1)

{

perror(bind);

exit(1);

}

if(listen(sockfd,MAX_QUE_CONN_NM)==-1)

{

perror(listen);

exit(1);

}

printf(Listening....\n);

/*调用fcntl()函数给套接字设置非阻塞属性*/

flags=fcntl(sockfd,F_GETFL);

if(flags0||fcntl(sockfd,F_SETFL,flags|O_NONBLOCK)0)

{

perror(fcntl);

exit(1);

}

while(1)

{

sin_size=sizeof(structsockaddr_in);

if((client_fd=accept(sockfd,

(structsockaddr*)client_sockaddr,sin_size))0)

{

perror(accept);

exit(1);

}

if((recvbytes=recv(client_fd,buf,BUFFER_SIZE,0))0)

{

perror(recv);

exit(1);

}

printf(Receivedamessage:%s\n,buf);

}/*while*/

close(client_fd);

exit(1);

}

运行该程序,结果如下所示:

$./net_fcntl

Listening....

accept:Resourcetemporarilyunavailable

可以看到,当accept()的资源不可用(没有任何未处理的等待连接的请求)时,程序就会自动返回。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261127.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

myeclipse不编译

错误: org.eclipse.core.internal.registry.configurationElementHandle cannot be cast to org.eclipse.jdt.core.compiler.CompilationParticipant) 解决: 关掉MyEclipse>把MyEclipse安装目录下的configuration中的update目录删掉>重…

eclipse配置PHP自动提示代码

为什么80%的码农都做不了架构师?>>> 配置php自动提示代码 (html/js和PHP方法一样) 1. 打开 Eclipse的 Window -> Preferences -> PHPeclipse -> PHP -> Code Assist 打开里面的Enable auto activation选项,下面有个…

Oracle 执行计划 提示 'PLAN_TABLE' is old version 解决方法

用set autotrace 或者 explain plan for 生成执行计划时,有如下提示:Note----- - PLAN_TABLE is old version导致这个错误的原因是曾经使用toad的执行计划分析过,所以执行了它自带的脚本生成了plan_table。解决办法,drop掉plan_…

C#磁盘遍历——递归

static void Main(string[] args){//创建秒表,记录查询的总时间Stopwatch timer new Stopwatch();timer.Start();//传入本地磁盘路径,遍历当前路径下的所有文件LoadDirectory("G:\传智播客.Net培训—就业班精品");timer.Stop();Console.Write…

linux卸载minicoda2,MiniConda2下载 MiniConda python 2.7 v4.3.30.2 Linux 64位 官方免费版(附安装步骤) 下载-脚本之家...

MiniConda python 2.7 Linux版是一款可以在Linux系统下使用的Python 环境管理工具,同时MiniConda是一个开源的软件包管理系统和环境管理系统,用于安装多个版本的软件包及其依赖关系,并在它们之间轻松切换,本次为大家提供的是Linux…

使用 python 操作 redis

1.安装pyredis (1)使用 # easy_install redis (2)直接编译安装 #wget https://pypi.python.org/packages/source/r/redis/redis-2.9.1.tar.gz #tar xvzf redis-2.9.1.tar.gz #cd redis-2.9.1 #python setup.py install 2.简单的re…

android-XML解析Dom,Sax,Pull

android平台上解析xml的常见的工具有三种:dom,sax,pull。 第一种是DOM, 它的特点是一次全部加载,如果对于数据量小的情况下,它的效率还可以,如果XML文件很大的情况下,速度就会慢起来。 第二种方…

射击的乐趣:WIN32诠释打飞机游戏

一楼留给链接http://blog.csdn.net/crocodile__/article/details/11860129 楼上神贴,膜拜片刻...... 一、游戏玩法和已经实现的功能 1.打开游戏会有提示是否开始游戏。 2.键盘↑↓←→控制保卫者飞机(米格21原型,米格粉们千万不要看这架飞机&…

硬盘安装Linux救援系统,硬盘安装linux系统

这里推荐大家使用Daemon Tool 这个Windows下的软件将ISO文件“解”到硬盘上。比方说shrike-i386-disc1.iso可以解压缩到C:盘的cd1目录,shrike-i386-disc2.iso解压缩到C:盘的cd2目录,shrike-i386-disc3.iso可以解压缩到C:盘的cd3目录待用。把cd1&#xff…

内容营销11金规

内容营销11金规 现在也许是解释和讲述一个很重要观点的好时机:创造给力的内容十分关键,但还不够。你还必须提出满足大量其他目标的材料,而这些材料,符合给力的内容的惯例,或者(你知道我们马上谈论这一点&am…

eclipse3.4 SVN插件安装

2019独角兽企业重金招聘Python工程师标准>>> SVN插件: http://subclipse.tigris.org/update_1.6.x 汉化版,现在我这边eclipse3.4是可用的。 转载于:https://my.oschina.net/dreamnight/blog/695060

工作那些事(十六)面试时,面试官喜欢的非技术问题汇总

在找工作的过程中,进行技术和人事面试时不可避免的。有的人笔试答的挺好,挂在了面试的时候,确实很可惜的。一般来说,技术性的岗位是笔试(有的还有性格测试题)、技术面试、人事面试。这里汇总一下面试时&…

连接两个linux系统软件,【技术共享】synergy-两台电脑共享一套鼠标键盘-Linuxwindows...

PS:这软件倒是不错,可是这要求两台电脑显示器都可以看到.当然一般我们是用不到的.再加上是局域网,直接用远程桌面连接或者控制软件也可以的.前些天,我把自己的台式电脑搬到实验室,与实验室里分配给我的电脑一起用。为了方便使用,我尝试了下用…

删除android系统自带的第三方软件

一般手机买来的时候都捆绑了第三方软件,并不是我们所需要的,那我们就删除它们,我们也有选择的权利。 第一步:原理。android捆绑的软件基本安装在/system/app文件下,删除下面的对应的了第三方软件APK文件即可完美卸载 如…

struts2 中文件的位置问题

开发情况下,js文件,模板文件等不是很重要的文件一般放在WebRoot根目录下, 这种情况下的模板文件中添加 css或者js 文件时是相对文件自身添加的,必要时可以通过..来返回到WebRoot根目录,例如: WebRoot目录下…

linux cgoup内存限制,Linux Cgroup系列(05):限制cgroup的CPU使用(subsystem之cpu)

在cgroup里面,跟CPU相关的子系统有cpusets、cpuacct和cpu。其中cpuset主要用于设置CPU的亲和性,可以限制cgroup中的进程只能在指定的CPU上运行,或者不能在指定的CPU上运行,同时cpuset还能设置内存的亲和性。设置亲和性一般只在比较…

Hive的安装和配置

在hadoop帐户下一、下载hive-0.8.1.tar.gzwget mirrors.cnnic.cn/apache/hive/stable/hive-0.11.0.tar.gz二、解压到/opt/modules目录下tar -zxvf hive-0.11.0.tar.gzcd hive-0.11.0三、配置Hive的环境变量(该步在root帐户下)vi /etc/profile.d/java.she…

容错性设计

即便你的产品90%的时间都运行良好。但是如果在用户需要帮助时置之不理,他们是不会忘记这一点的。——《getting real》 我们有时候不能不面对产品出错的时候。无论设计得多么用心,无论做了多少测试,用户仍然会遇到错误和问题。既然…

19:A*B问题

总时间限制: 1000ms内存限制: 65536kB描述输入两个正整数A和B&#xff0c;求A*B。 输入一行&#xff0c;包含两个正整数A和B&#xff0c;中间用单个空格隔开。1 < A,B < 50000。输出一个整数&#xff0c;即A*B的值。样例输入3 4 样例输出12错误代码&#xff1a; #include…

hdu2057

hdu2057 #include <stdio.h> int main(){__int64 a,b,t;while(~scanf("%I64X%I64X",&a,&b)){if(ab<0) {printf("-%I64X\n",-(ab));}else{printf("%I64X\n",ab);}}return 0; } posted on 2013-11-02 13:41 symons 阅读(...) 评论…