Socket,非阻塞,fcntl
来源:互联网 发布:七个魂器都是什么 知乎 编辑:程序博客网 时间:2024/06/06 19:14
一、fcntl
用以下方法将socket设置成为非阻塞方式
int flags = fcntl(socket,F_GETFL,0);
fcntl(socket,F_SETFL,flags|O_NONBLOCK);
将非阻塞的设置回阻塞可以用
int flags = fcntl(socket,F_GETFL,0);
fcntl(socket,F_SETFL,flags&~O_NONBLOCK);
------------------------------------------------------------------------
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);
[描述] fcntl()针对(文件)描述符提供控制。参数fd是被参数cmd操作(如下面的描述)的描述符。针对cmd的值,fcntl能够接受第三个参数int arg。
Cmd值的F_GETFL和F_SETFL:
F_GETFL 取得fd的文件状态标志,如同下面的描述一样(arg被忽略),在说明open函数时,已说明了文件状态标志。不幸的是,三个存取方式标志
(O_RDONLY ,O_WRONLY , 以及O_RDWR)并不各占1位。(这三种标志的值各是0 , 1和2,由于历史原因,这三种值互斥 — 一个文件只能有这三种值之一。)
因此首先必须用屏蔽字O_ACCMODE相与取得存取方式位,然后将结果与这三种值相比较。
F_SETFL 设置给arg描述符状态标志,可以更改的几个标志是:O_APPEND,O_NONBLOCK,O_SYNC 和 O_ASYNC。而fcntl的文件状态标志总共有7个:
O_RDONLY , O_WRONLY , O_RDWR , O_APPEND , O_NONBLOCK , O_SYNC和O_ASYNC
二、非阻塞socket
1.三次握手同时做其他的处理。connect要花一个往返时间完成,从几毫秒的局域网到几百毫秒或几秒的广域网。这段时间可能有一些其他的处理要执行,比如数据准备,预处理等。
2.用这种技术建立多个连接。这在web浏览器中很普遍.
3.由于程序用select等待连接完成,可以设置一个select等待时间限制,从而缩短connect超时时间。多数实现中,connect的超时时间在75秒到几分钟之间。有时程序希望在等待一定时间内结束,使用非阻塞connect可以防止阻塞75秒,在多线程网络编程中,尤其必要。 例如有一个通过建立线程与其他主机进行socket通信的应用程序,如果建立的线程使用阻塞connect与远程通信,当有几百个线程并发的时候,由于网络延迟而全部阻塞,阻塞的线程不会释放系统的资源,同一时刻阻塞线程超过一定数量时候,系统就不再允许建立新的线程(每个进程由于进程空间的原因能产生的线程有限),如果使用非阻塞的connect,连接失败使用select等待很短时间,如果还没有连接后,线程立刻结束释放资源,防止大量线程阻塞而使程序崩溃。
目前connect非阻塞编程的普遍思路是:
在一个TCP套接口设置为非阻塞后,调用connect,connect会在系统提供的errno变量中返回一个EINRPOCESS错误,此时TCP的三路握手继续进行。之后可以用select函数检查这个连接是否建立成功
- Socket,非阻塞,fcntl
- Linux,socket,非阻塞,fcntl
- Linux,socket,非阻塞,fcntl
- 用fcntl设定socket为非阻塞
- 用fcntl设定socket为非阻塞
- 非阻塞IO--fcntl
- 高级套接字函数 fcntl 设置socket 非阻塞
- 阻塞非阻塞socket
- socket阻塞,非阻塞
- Linux下socket设置为非阻塞方式和fcntl系统调用
- Linux下socket设置为非阻塞方式和fcntl系统调用
- Linux下socket设置为非阻塞方式和fcntl系统调用
- Linux下socket设置为非阻塞方式和fcntl系统调用
- fcntl函数对非阻塞的设置
- fcntl设置非阻塞文件描述符
- Socket的阻塞/非阻塞
- Socket的阻塞/非阻塞
- Socket的阻塞/非阻塞
- Easyui Datagrid 根据字段动态合并行
- 用qt creator画实时图像
- js数组添加元素方式使用push
- strut2的进阶配置和属性参数设置获取问题
- py2exe的官方tutorial
- Socket,非阻塞,fcntl
- Log4j MDC使用案例
- Leetcode#53: Maximum Subarray
- jquery通过参数给select设置默认值
- Java类加载机制
- ios应用/游戏内购接入方法
- HTML中块状元素/内联元素的种类和区分
- pom.xml配置
- 常见Java面试题