本文引用地址: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()的资源不可用(没有任何未处理的等待连接的请求)时,程序就会自动返回。

linux嵌入式c网络编程,嵌入式Linux网络编程之:网络高级编程相关推荐

  1. Python网络编程之day01-网络编程基础

    Python网络编程之day01-网络编程基础 文章目录 Python网络编程之day01-网络编程基础 一.网络通信概述 二.IP地址 三.ping,ifconfig,ipconfig 四.端口 代 ...

  2. pythonasyncio并发编程实战_python异步编程之asyncio(百万并发)

    [python异步编程之asyncio(百万并发)] 前言:python由于GIL(全局锁)的存在,不能发挥多核的优势,其性能一直饱受诟病.然而在IO密集型的网络编程里,异步处理比同步处理能提升成百上 ...

  3. 高级编程中C语言属于,c语言高级编程

    c语言高级编程 C高级编程 责任编辑:admin 更新日期:2005-8-6 深入了解C语言(函数的参数传递和函数使用参数的方法) tangl_99(原作) 关键字 C语言,汇编,代码生成,编译器 C ...

  4. 什么是编程?——我的编程之路

    在座的都是有一年以上码龄的老同学了,今天我不写教程,我只想问一问你们,到底何谓"编程"? 编程,编写程序,编写枯燥而无聊的程序. 以前我曾在一片电子教程中看到他这么解释:" ...

  5. Linux多线程编程之pthread (多线程编程) --- (高级)---原作优秀

    https://blog.csdn.net/skyroben/article/details/72793409 (博客优秀) 1.背景知识 Linux没有真正意义上的线程,它的实现是由进程来模拟,所以 ...

  6. python怎么编程输入坐标_python编程之API入门: (一)使用百度地图API查地理坐标...

    在网络编程中,我们会和API打交道.那么,什么是API?如何使用API呢?本文分享了一下我对API的理解以及百度地图API的使用. API是"Application Programming ...

  7. python界面编程和网口通信_Python—网络通信编程之tcp通信编程

    服务端代码 import socket # 1.创建流式套接字实例 # server = socket.socket() server = socket.socket(socket.AF_INET, ...

  8. 编程之美:编程判断两个链表是否相交

    1.问题描述 给出两个单向链表的头指针,比如h1.h2,判断两个链表是否相交.编程之美为了简化问题,假设两个链表均不带环. 如下图: 2.分析与解法 解法一:直观法,先判断第一个链表的每个节点是否在第 ...

  9. 《Windows游戏编程大师技巧》三、Windows高级编程

    Windows编程很绝的地方在于:你不用了解太多细节,就可以完成很多工作. 使用资源 资源就是你的程序代码结合在一起的多块数据,可以被程序本身在运行时加载. 资源应当也放在程序的.EXE文件中的原因是 ...

  10. 深入浅出Visual C++串口编程--深入浅出VC++串口编程之DOS的串口编程

    在DOS平台下,操作串口主要有下列方式:通过BIOS调用.通过串口的硬件中断或通过对串口硬件进行轮询,本章将对以上三种方式进行具体的介绍并给出例子. 1.BIOS中断 在DOS操作系统下,IBM PC ...

最新文章

  1. Linux命令初识一
  2. 算数运算符/空值问题
  3. [SceneKit专题]11-Reference-Nodes引用节点
  4. Python进阶06 循环对象
  5. 【LeetCode笔记】232. 用栈实现队列(Java、栈、队列)
  6. markdown与latex:书写单边大括号左边或右边即在没有括号的一端加点
  7. mapinfo开发资料(转)
  8. 玻纤效应差分信号影响及处理方法,使用sigrity建模玻纤效应仿真
  9. 如何将PDF转Word文档
  10. Wiley Online Library的LATEX模板说明
  11. mysql语句重命名索引_如何重命名MySQL中的索引
  12. 手把手教你使用Python批量创建复工证明
  13. 计算机信息处理技术的发展历程,中文信息处理技术发展简史.docx
  14. Tsunami: A Learned Multi-dimensional Index for Correlated Data and SkewedWorkloads(VLDB21)
  15. [办公应用]让WORD自动显示到四级目录
  16. ImGui实现Button高亮
  17. 量化交易是如何赚钱的?
  18. Qt实现mqtt客户端和mqtt服务器搭建
  19. 用JavaScript实现一个简易计算器功能
  20. 解决 linux(centos7)word转换pdf时,pdf乱码问题

热门文章

  1. 在eclipse中创建第一个java应用程序,并在控制台输出“hello world”。
  2. 第3章-动态基础分析实验
  3. 【JAVA设计模式】外观模式(Facade Pattern)
  4. new和delete
  5. 14.cookie与自动登陆
  6. ubuntu制作usb启动盘
  7. 修正IE6重复文字bug
  8. 八、开发者工具和指南(四) Orchard dependencies and libraries
  9. koa --- [MVC实现之一]自定义路由读取规则
  10. javascript --- Object.assign()浅复制解决方法