Linux-IO函数

数据的IO和复用

网络数据能够正常的到达用户,并被用户接受网络数据传输的目的。网络数据的接受以及发送有多种方案,例如直接接受或者发送数据通过向量发送接受数据,通过消息进行接受以及发送。

1.介绍主要的常用的IO函数

2。介绍几种常用的IO模型

3 介绍select和pselect函数,如何利用这两个文件的描述符号进行文件读写描述符的监视。

4.简单的介绍函数poll和ppoll含义使用以及区别

5 以简单的例子介绍非堵塞编程。

--------------------------------------------------     IO 函数    -----------------------------------------------

recv函数用于接受数据,函数的原型如下。recv函数从套接字s中接受数据放到缓冲区buf中,buf的长度为len,操作的方式由flag决定。第一个参数s是套接字文件的描述符,它是由函数socket()返回的,第二个参数buf是一个指针,指向接受网络套接字的缓冲区,第三个参数表示缓冲区的大小,以字节为单位。



#include <sys/type.h>

#include <sys/socket.h>

ssize_t recv(int s,void * buf,size_t len,int flags);

                                           flags的值以及含义

MSG_DONTWAIT                    非阻赛的操作,立刻返回不等待

MSG_ERRQUEUE                   错误消息从套接字错误队列接收

MSG_OOB                                接收外数据数据

MSG_PEEK                               查看数据,不进行数据缓冲区的清空

MSG_TRUNC                             返回所有的数据,及时指定缓冲区过小

MSG_WAITALL                          等待所有的消息

MSG_DONTWAIT:这个标志将单个IO操作设为非堵塞方式,而不需要在套接字上打开非堵塞的标志,执行IO操作。然后关闭非堵塞的标志。

MSG_ERRQUEUE:  改错误的传输依赖于所使用的协议。

MSG_OOB :这个标志可以接收带外数据,而不接收一般的数据。

MSG_PEEK : 这个标志用于查看可读数据,在recv函数执行后,内核不会将这些数据丢弃掉。

MSG_TRUNC: 在接收数据后,如果用户的缓冲区大小不足以完全复制缓冲区的数据,则将数据折断,仅复制用户缓冲区大小的数据,多余的数据将会舍弃掉。

MSG_WAITALL:这个标志告诉内核在没有读到请求的字节数之前不使读操作返回。如果系统支持使用这个标志,可以去掉readn()函数而使用下面的代替

#define readn(fd,ptr,n) recv(fd,ptr,n,MSG_WAITALL)

即使设置MSG_WAITALL,如果发生以下情况(a)捕获一个信号(b)连接终止(c)在套接字上发生了错误,这个函数返回的字节数依然会比请求的少。当指定MSG_WAITALL标志时,函数会复制与用户指定长度相等的数据。如果内核中的当前数据不能满足要求,会一直等待直到数据足够才返回。

函数recv()的返回值是成功接收到的字节数。当返回-1时错误发生,可以查看errno获取错误码,当另一个访民啊使用close()关闭连接时,返回值为0;

常见的错误码如下:

EAGAIN          套接字定义为非堵塞,而操作采用了堵塞的方式,或者定义的超时时间已经达到却没有接收到数据。

EBADF   参数s不是合法的描述符

ECONNREFUSED  远程主机不允许此操作

EFAULT  接受缓冲区指针在此进程之外

EINTR      接收到中断信号

EINTVAl   传递了不合法的参数

ENOTCONN   套接字s表示流式套接字,此套接字没有连接。

ENOTSOCK   参数不是套接字描述符

recv()函数通常用于TCP类型的套接字。UDP使用recvfrom()函数接受数据,当然在数据包套接字绑定地址一节端口号后,也可以使用recv()接受数据。

recv()函数 从内核的接收缓冲区复制到数据到用户指定的缓冲区。当内核的缓冲区比指定的缓冲区小时,一般情况下(没有采用MSG_WAITALL标志)会复制缓冲区的所有的数据到用户缓存区。并返回数据的长度。当内核的接收的缓冲区的数据比用户指定的多时,会将用户指定长度的len的接收缓冲区的数据复制到用户指定地址。其余的数据需要下次调用该函数时在复制,内核在复制用户指定的数据之后,会销毁已经复制完毕的数据,并进行调整。

使用send()函数发送数据

send()函数用于发送数据,函数的原型如下

#include<sys/types.h>

#include <sys/socket.h>

ssize_t send(int s,const void * buf,size_t len,int flags)

send()函数将缓冲区buf大小为len的数据。通过套接字文件描述符按照flags指定的方式发送出去,其中的参数含义与recv中的含义一致,它的返回值是成功的字节数,用于用户的缓冲区buf中的数据在通过send()函数进行发送的时候,并不一定能够全部发送出去,所以要检查send() 函数的返回值,按照与计划发送的字节长度是否相等来判断下一步的操作。

当send()函数的返回值小于len的时候,表明缓冲区仍然由部分数据没有成功的发送,这时需要重新发送剩余的部分,通常剩余数据发送的方法是对原来的buf中的数据位置进行偏移,偏移的大小为已经成功发送的字节数。

send 函数错误吗如下:

函数send()只能用于套接字处于连接状态的描述符,之前必须使用connect()函数或者其它函数进行连接。对于send()函数和write()函数之间的差别表示发送方式的flag,当flag为0时,send()函数和write()函数完全一致,而且send(s,buf,len,flags)与sendto(s,buf,len,flags,NULL,0)等价的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • http://python.jobbole.com/85231/ 关于专业技能写完项目接着写写一名3年工作经验的J...
    燕京博士阅读 7,484评论 1 118
  • socket通信原理 socket又被叫做套接字,它就像连接到两端的插座孔一样,通过建立管道,将两个不同的进程之间...
    jiodg45阅读 1,068评论 0 1
  • 1.send 函数 intsend(SOCKETs, constcharFAR*buf, intlen, intf...
    踩在浪花上00阅读 3,947评论 0 1
  • 网络模型 物理层 物理层表示的是比特流传输,通常包括串口/COM口、并行/LPT口、USB、网线接口、电话线接口;...
    秋风弄影阅读 666评论 0 2
  • 404页面为何会出现:当用户输入了错误的链接时,返回的页面,以及页面内容已被删除,找不到原来页面。 404页面的目...
    宛平阅读 270评论 0 0