Windows用以下方法将socket设置为非阻塞方式 :

unsigned long ul=1;

SOCKET s=socket(AF_INET,SOCK_STREAM,0);

int ret=ioctlsocket(s, FIONBIO, (unsigned long *)&ul);//设置成非阻塞模式。

if(ret==SOCKET_ERROR)//设置失败。

{

}

Linux用以下方法将socket设置为非阻塞方式 

int flags = fcntl(socket, F_GETFL, 0);

fcntl(socket, F_SETFL, flags | O_NONBLOCK);
用以下方法将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);

功能描述:根据文件描述词来操作文件的特性。

用法: 
int fcntl(int fd, int cmd); 
int fcntl(int fd, int cmd, long arg); 
int fcntl(int fd, int cmd, struct flock *lock);

参数: 
fd:文件描述词。 
cmd:操作命令。 
arg:供命令使用的参数。 
lock:同上。

有以下操作命令可供使用

一. F_DUPFD :复制文件描述词 。

二. FD_CLOEXEC :设置close-on-exec标志。如果FD_CLOEXEC位是0,执行execve的过程中,文件保持打开。反之则关闭。

三. F_GETFD :读取文件描述词标志。

四. F_SETFD :设置文件描述词标志。

五. F_GETFL :读取文件状态标志。

六. F_SETFL :设置文件状态标志。 
其中O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_EXCL, O_NOCTTY 和 O_TRUNC不受影响, 
可以更改的标志有 O_APPEND,O_ASYNC, O_DIRECT, O_NOATIME 和 O_NONBLOCK。

七. F_GETLK, F_SETLK 和 F_SETLKW :获取,释放或测试记录锁,使用到的参数是以下结构体指针: 
F_SETLK:在指定的字节范围获取锁(F_RDLCK, F_WRLCK)或者释放锁(F_UNLCK)。如果与另一个进程的锁操作发生冲突,返回 -1并将errno设置为EACCES或EAGAIN。

F_SETLKW:行为如同F_SETLK,除了不能获取锁时会睡眠等待外。如果在等待的过程中接收到信号,会立即返回并将errno置为EINTR。

F_GETLK:获取文件锁信息。

F_UNLCK:释放文件锁。

为了设置读锁,文件必须以读的方式打开。为了设置写锁,文件必须以写的方式打开。为了设置读写锁,文件必须以读写的方式打开。

八. 信号管理 
F_GETOWN, F_SETOWN, F_GETSIG 和 F_SETSIG 被用于IO可获取的信号。

F_GETOWN:获取当前在文件描述词 fd上接收到SIGIO 或 SIGURG事件信号的进程或进程组标识 。

F_SETOWN:设置将要在文件描述词fd上接收SIGIO 或 SIGURG事件信号的进程或进程组标识 。

F_GETSIG:获取标识输入输出可进行的信号。

F_SETSIG:设置标识输入输出可进行的信号。

使用以上命令,大部分时间程序无须使用select()或poll()即可实现完整的异步I/O。

九. 租约( Leases) 
F_SETLEASE 和 F_GETLEASE 被用于当前进程在文件上的租约。文件租约提供当一个进程试图打开或折断文件内容时,拥有文件租约的进程将会被通告的机制。

F_SETLEASE:根据以下符号值设置或者删除文件租约

1.F_RDLCK设置读租约,当文件由另一个进程以写的方式打开或折断内容时,拥有租约的当前进程会被通告。 
2.F_WRLCK设置写租约,当文件由另一个进程以读或以写的方式打开或折断内容时,拥有租约的当前进程会被通告。 
3.F_UNLCK删除文件租约。

F_GETLEASE:获取租约类型。

十.文件或目录改变通告 
(linux 2.4以上)当fd索引的目录或目录中所包含的某一文件发生变化时,将会向进程发出通告。arg参数指定的通告事件有以下,两个或多个值可以通过或运算组合。 
1.DN_ACCESS 文件被访问 (read, pread, readv) 
2.DN_MODIFY 文件被修改(write, pwrite,writev, truncate, ftruncate) 
3.DN_CREATE 文件被建立(open, creat, mknod, mkdir, link, symlink, rename) 
4.DN_DELETE 文件被删除(unlink, rmdir) 
5.DN_RENAME 文件被重命名(rename) 
6.DN_ATTRIB 文件属性被改变(chown, chmod, utime[s])

返回说明: 
成功执行时,对于不同的操作,有不同的返回值 
F_DUPFD: 新文件描述词 
F_GETFD: 标志值 
F_GETFL: 标志值 
F_GETOWN: 文件描述词属主 
F_GETSIG: 读写变得可行时将要发送的通告信号,或者0对于传统的SIGIO行为

对于其它命令返回0。

失败返回-1,errno被设为以下的某个值 
EACCES/EAGAIN: 操作不被允许,尚未可行 
EBADF: 文件描述词无效 
EDEADLK: 探测到可能会发生死锁 
EFAULT: 锁操作发生在可访问的地址空间外 
EINTR: 操作被信号中断 
EINVAL: 参数无效 
EMFILE: 进程已超出文件的最大可使用范围 
ENOLCK: 锁已被用尽 
EPERM:权能不允许 
struct flock { 
short l_type; /* 锁类型: F_RDLCK, F_WRLCK, F_UNLCK */ 
short l_whence; /* l_start字段参照点: SEEK_SET(文件头), SEEK_CUR(文件当前位置), SEEK_END(文件尾) */ 
off_t l_start; /* 相对于l_whence字段的偏移量 */ 
off_t l_len; /* 需要锁定的长度 */ 
pid_t l_pid; /* 当前获得文件锁的进程标识(F_GETLK) */ 
};

原文参考:http://www.linuxidc.com/Linux/2011-04/34674.htm

socket设置为非阻塞方式(windows和linux)的更多相关文章

  1. 服务器编程心得(四)—— 如何将socket设置为非阻塞模式

    1. windows平台上无论利用socket()函数还是WSASocket()函数创建的socket都是阻塞模式的: SOCKET WSAAPI socket( _In_ int af, _In_ ...

  2. socket异步通信-如何设置成非阻塞模式、非阻塞模式下判断connect成功(失败)、判断recv/recvfrom成功(失败)、判断send/sendto

    socket异步通信-如何设置成非阻塞模式.非阻塞模式下判断connect成功(失败).判断recv/recvfrom成功(失败).判断send/sendto 博客分类: Linux Socket s ...

  3. 非阻塞方式connect编程

    参考博客: ①setsockopt()函数使用详解:http://blog.csdn.net/tody_guo/article/details/5972588 ②setsockopt :SO_LING ...

  4. 需求:过滤下面这个网页里共723行 校对中里 行数为两位数的 行 并设置sz和rz在Windows和Linux之间发送和接收文件不用搭FTP

    需求:过滤下面这个网页里共723行 校对中里 行数为两位数的 行 并设置sz和rz在Windows和Linux之间发送和接收文件不用搭FTP 需求:过滤下面这个网页里共723行 校对中里 行数为两位数 ...

  5. 用WINSOCK API实现同步非阻塞方式的网络通讯

    Option Base 0Option Explicit '* ************************************************** *'*  模块名称:Winsock ...

  6. linux C之getchar()非阻塞方式

    参考链接: http://blog.csdn.net/zydlyq/article/details/50963360 #include "../include/CommUart.h" ...

  7. 将服务端select设置为非阻塞,处理更多业务

    服务端代码: #include<WinSock2.h> #include<Windows.h> #include<vector> #include<stdio ...

  8. select应用于read函数 超时非阻塞方式

    /* * "Timed" read - timout specifies the # of seconds to wait before * giving up (5th argu ...

  9. Socket,非阻塞,fcntl

    一.fcntl 用以下方法将socket设置成为非阻塞方式 int  flags = fcntl(socket,F_GETFL,0); fcntl(socket,F_SETFL,flags|O_NON ...

随机推荐

  1. JAVA数组的定义及用法

    数组是有序数据的集合,数组中的每一个元素具有同样的数组名和下标来唯一地确定数组中的元素. 1. 一维数组 1.1 一维数组的定义 type arrayName[]; type[] arrayName; ...

  2. WebBrowser 禁用脚本错误提示

    public partial class Text : UserControl {        public Text()        {                              ...

  3. android147 360 程序锁fragment

    package com.itheima.mobileguard.fragment; import java.util.ArrayList; import java.util.List; import ...

  4. innodb_max_dirty_pages_pct与检查点的关系

      http://ourmysql.com/archives/310 数据库运行一段时间后,经常导致服务器大量的swap,我怀疑是innodb中的脏数据太多了,因为没有free space了,mysq ...

  5. Telnet、SSH和VNC

    以下内容出自<Red Hat Linux服务器配置与应用>第17章:Telnet.SSH和VNC服务的配置与应用.俗话说:“前人栽树,后人乘凉”.我懒得再照书本打一遍了,就从这里拷贝了一份 ...

  6. 1043. Is It a Binary Search Tree (25)

    the problem is from pat,which website is http://pat.zju.edu.cn/contests/pat-a-practise/1043 and the ...

  7. html禁止清除input文本输入缓存

    多数浏览器默认会缓存input的值,只有使用ctl+F5强制刷新的才可以清除缓存记录. 如果不想让浏览器缓存input的值,有2种方法: 方法一: 在不想使用缓存的input中添加 autocompl ...

  8. 2014年GCT考试报名时

    第一阶段: 网上报名时间预计为2014年6月20日至2014年7月10日. 考生可在6月20日后在中国学位与研究生教育信息网(http://www.chinadegrees.cn/)网站报名.网报时按 ...

  9. Honda HDS IMMO PCM Code calculator Free Download

    HDS IMMO PCM Code calculator software for Honda vehicle models is free download available in Eobd2.f ...

  10. kali的openvas安装 留下笔记

    kali的openvas安装 留下笔记,以便下次再查开始在kali找openvas,竟然kali不自带,害的要下载. apt-get updateapt-get dist-upgradeapt-get ...