linux socket read write,socket编程中write、read和send、recv之间的区别-程序员宅基地

技术标签: linux socket read write  

http://blog.csdn.net/petershina/article/details/7946615

一旦,我们建立好了tcp连接之后,我们就可以把得到的fd当作文件描述符来使用。

由此网络程序里最基本的函数就是read和write(int fd, const void*buf,size_t nbytes);

write的返回值大于0,表示写了部分或者是全部的数据. 这样我们用一个while循环来不停的写入,但是循环过程中的buf参数和nbyte参数得由我们来更新。也就是说,网络写函数是不负责将全部数据写完之后在返回的。

2)返回的值小于0,此时出现了错误.我们要根据错误类型来处理.

如果错误为EINTR表示在写的时候出现了中断错误.

如果为EPIPE表示网络连接出现了问题(对方已经关闭了连接).

为了处理以上的情况,我们自己编写一个写函数来处理这几种情况.

int my_write(int fd,void *buffer,int length)

{

int bytes_left;

int written_bytes;

char *ptr;

ptr=buffer;

bytes_left=length;

while(bytes_left>0)

{

written_bytes=write(fd,ptr,bytes_left);

if(written_bytes<=0)

{

if(errno==EINTR)

written_bytes=0;

else

return(-1);

}

bytes_left-=written_bytes;

ptr+=written_bytes;

}

return(0);

}

读函数read

ssize_t read(int fd,void *buf,size_t nbyte)

read函数是负责从fd中读取内容.当读成功 时,read返回实际所读的字节数,如果返回的值是0

表示已经读到文件的结束了,小于0表示出现了错误.如果错误为EINTR说明读是由中断引起 的, 如果是ECONNREST表示网络连接出了问题.

和上面一样,我们也写一个自己的读函数.

int my_read(int fd,void *buffer,int length)

{

int bytes_left;

int bytes_read;

char *ptr;

bytes_left=length;

while(bytes_left>0)

{

bytes_read=read(fd,ptr,bytes_read);

if(bytes_read<0)

{

if(errno==EINTR)

bytes_read=0;

else

return(-1);

}

else if(bytes_read==0)

break;

bytes_left-=bytes_read;

ptr+=bytes_read;

}

return(length-bytes_left);

}

数据的传递

有了上面的两个函数,我们就可以向客户端或者是服务端传递数据了.比如我们要传递一个结构.可以使用如下方式

struct my_struct my_struct_client;

write(fd,(void *)&my_struct_client,sizeof(struct my_struct);

char buffer[sizeof(struct my_struct)];

struct *my_struct_server;

read(fd,(void *)buffer,sizeof(struct my_struct));

my_struct_server=(struct my_struct *)buffer;

在网络上传递数据时我们一般都是把数据转化为char类型的数据传递.接收的时候也是一样的注意的是我们没有必要在网络上传递指针(因为传递指针是没有任何意义的,我们必须传递指针所指向的内容)

6.1 recv和send函数提供了和read和send(int sockfd,void *buf,int len,int flags)

前面的三个参数和read,send函数使用的标志.这个标志告诉IP.目的主机在本地网络上面,没有必要查找表.这个标志一般用网络诊断和路由程序里面.

MSG_OOB:表示可以接收和发送带外的数据.关于带外数据我们以后会解释的.

MSG_PEEK:是recv函数的使用标志,表示只是从系统缓冲区中读取内容,而不清除系统缓冲区的内容.这样下次读的时候,仍然是一样的内容.一般在有多个进程读写数据时可以使用这个标志.

MSG_WAITALL是recv函数的使用标志,表示等到所有的信息到达时才返回.使用这个

标志的时候recv回一直阻塞,直到指定的条件满足,或者是发生了错误. 1)当读到了指定的字节时,函数正常返回.返回值等于len

2)当读到了文件的结尾时,函数正常返回.返回值小于len 3)当操作发生错误时,返回-1,且设置错误为相应的错误号(errno)

MSG_NOSIGNAL is a flag used by send a SIGPIPE signal on errors on stream oriented sockets when the other end breaks the connection. The

EPIPE error is still returned as normal.

Though it is in some Berkely sockets APIs (notably Linux) it does not

exist in what some refer to as the reference implementation,

FreeBSD, which instead uses a socket option

SO_NOSIGPIPE?. 对于服务器端,我们可以使用这个标志。目的是不让其发送SIG_PIPE信号,导致程序退出。

如果flags为0,则和read,write一样的操作.还有其它的几个选项,不过我们实际上用的很少,可以查看 Linux Programmer's Manual得到详细解释

socket编程中write、read和send、recv之间的区别~转载

socket编程中write.read和send.recv之间的区别   http://blog.csdn.net/petershina/article/details/7946615 一旦,我们建立 ...

Socket编程中 setsockopt的作用

功能描述: 获取或者设置与某个套接字关联的选 项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层.当操作套接字选项时,选项位于的层和选项的名称必须给出.为了操作套接字层的选项,应该 将层的值 ...

socket编程中客户端常用函数

1 常用函数 1.1   connect() int connect(int sockfd, const struct sockaddr *servaddr, socklen_taddrlen); 客 ...

PHP socket 编程中的超时设置

PHP socket 编程中的超时设置.网上找了半天也没找到.贴出来分享之:设置$socket 发送超时1秒,接收超时3秒: $socket = socket_create(AF_INET,SOCK_ ...

Spring中Model、ModelMap及ModelAndView之间的区别

Spring中Model.ModelMap及ModelAndView之间的区别   1. Model(org.springframework.ui.Model)Model是一个接口,包含addAttr ...

C&num;中string&period;Empty、&quot&semi;&quot&semi;和null 之间的区别

1.C#中string.Empty.""和null 之间的区别 (http://blog.csdn.net/henulwj/article/details/7830615)

Socket编程中的强制关闭与优雅关闭及相关socket选项

以下描述主要是针对windows平台下的TCP socket而言. 首先需要区分一下关闭socket和关闭TCP连接的区别,关闭TCP连接是指TCP协议层的东西,就是两个TCP端之间交换了一些协议包( ...

&lbrack;转&rsqb;Socket编程中,阻塞与非阻塞的区别

阻塞:一般的I/O操作可以在新建的流中运用.在服务器回应前它等待客户端发送一个空白的行.当会话结束时,服务器关闭流和客户端socket.如果在队列中没有请示将会出现什么情况呢?那个方法将会等待一个的到 ...

Socket编程中,阻塞与非阻塞的区别

阻塞:一般的I/O操作可以在新建的流中运用.在服务器回应前它等待客户端发送一个空白的行.当会话结束时,服务器关闭流和客户端socket.如果在队列中没有请示将会出现什么情况呢?那个方法将会等待一个的到 ...

Linux socket 编程中存在的五个隐患

前言:         Socket API 是网络应用程序开发中实际应用的标准 API.尽管该 API 简单,但是   开发新手可能会经历一些常见的问题.本文识别一些最常见的隐患并向您显示如何避免它 ...

随机推荐

【erlang】IPv6格式转IPv4

erlang里面的httpd模块保存的http请求头里面,其中remote_addr 保存的是IPv6的格式. 即使是IPv4,也会用IPv6的格式来保存.如 {remote_addr, " ...

layer&period;js定制弹窗

点击

定制

金山词霸每日一句开放平台 &period;NET demo

先附上地址:http://open.iciba.com/?c=api 小金山提供了2种获取数据的方式 1. 通过填入自己的网站名称.网址.邮箱地址 来生成一段javascript脚本,直接将生成的代码 ...

ubuntu中gdb调试工具的使用

首先有一段.c代码 1.可调试gcc编译:gcc -g -o xxx xxx.c 2.启动gdb调试 gdb xxx 3.在main函数处设置断点 break main 4.运行程序 run 5.其他 ...

ACL技术总结

1.ACL的全称是访问控制列表,本质上是定义一组策略,以便指导报文在交换机内部的转发行为. 2.要配置策略,首先要明确ACL应用的对象,可以是针对端口,也可以是针对特殊的一条流. 针对端口,就是指端口 ...

&lbrack;matlab&rsqb; 5&period;字符运算与微积分

首先介绍一下matlab里的符号计算 符号变量可以看成是数学中含参数 的表达式中的参数 matlab能进行像(a+b)(a-b)=a^2-b^2这样的计算 要进行符号计算首先要定义符号变量 定义符号对 ...

Java的学习02

今天依旧记录一下今天的学习的知识. /** * 测试StringBuilder StringBuffer,可变字符序列 * String对象称为“不可变对象"指的是对象内部成员变量的值无法再 ...

221&period; 链表求和 II

假定用一个链表表示两个数,其中每个节点仅包含一个数字.假设这两个数的数字顺序排列,请设计一种方法将两个数相加,并将其结果表现为链表的形式. 样例 样例 1: 输入t:6->1->7 2-& ...

OpenDaylight虚拟租户网络&lpar;VTN&rpar;详解及开发环境搭建

一.VTN简介及架构分析:   具体详见开发人员指南wiki:https://wiki.opendaylight.org/view/Release/Lithium/VTN/developer_Guid ...

USACO 6&period;4 Wisconsin Squares

Wisconsin Squares It's spring in Wisconsin and time to move the yearling calves to the yearling past ...

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39529302/article/details/116966578

智能推荐

html js相册样式,JavaScript+CSS相册特效实例代码-程序员宅基地

文章浏览阅读529次。下面小编就为大家带来一篇JavaScript+CSS相册特效实例代码。小编觉得挺不错的,现在就分享JavaScript+css的源码给大家,也给大家做个参考。对JavaScript和css制作相册感兴趣一起跟随小编过来看看吧嗯 就是这样一个例子,视频学到的一个特效,实际用处并不大,但是可以帮助理解JS语言和熟悉CSS3样式。设计:观察一张图片的变化,发现:1、图片缩放(随机,并且不是同时运动)1、..._相册制作 js css

flutter dio请求DioError [DioErrorType.DEFAULT]: SocketException: Insecure socket connections are disal-程序员宅基地

文章浏览阅读1.9k次。一般发生在是安卓9的设备上,在flutter 发起网络请求中,dio报错DioError [DioErrorType.DEFAULT]: SocketException: Insecure socket connections are disallowed by platform: ****解决方案:在安卓/android/app/src/main/AndroidManifest.xml 中检查,是否存在<uses-permission android:name="androi.._dioerror

yii2 mysql model_Yii中Model(模型)的创建及使用方法-程序员宅基地

文章浏览阅读906次。本文实例分析了Yii中Model(模型)的创建及使用方法。分享给大家供大家参考,具体如下:YII 实现了两种模型,表单模型(CFormModel类)和Active Record模型(CAtiveRecord类),它们都继承自CModel类。 CFormModel代表的数据模型是从HTML表单收集的输入,封装了所有逻辑(如表单的验证和其它业务逻辑,应用到表单的域上)。它能将数据存储在内 存中,或者在..._yii2 定义model字段

ad19原理图标注_AD19中原理图的模板如何进行编辑?-程序员宅基地

文章浏览阅读8.5k次,点赞3次,收藏28次。我们在进行原理图设计的时候,有时候不想去用软件自带默认的模板,想要用自己设计的模板,就涉及到我们的模板怎么去编辑的呢?我们应该如何去编辑原理图自己设计的模板?操作步骤是怎么的呢?我们今天就以AD19为例去进行原理图的如何进行编辑的教程。1.首先我们需要把原理图的默认模板给取消掉,在属性框中找到“Title Bloc”前面的√给去掉即可,一下为对比图:那么,我们的默认模板就已经消失了。2.默认消..._ad19原理图标题栏修改

【漏洞复现】Apache系列(二)之Solr漏洞复现-程序员宅基地

文章浏览阅读7.1k次。【漏洞复现】Apache系列(二)之Solr漏洞复现_solr漏洞

规范字体:font-family 的用法-程序员宅基地

文章浏览阅读949次,点赞16次,收藏20次。一些前端UI库例如bootstrap会给根节点(例如/)设置类似这样(font-family: sans-serif;无衬线字体)的字体规范,以防止页面字体不统一。_font-family

随便推点

江西 高职 分数 计算机,快讯!江西高职(专科)批次各高校投档分数线出炉…...-程序员宅基地

文章浏览阅读241次。记者获悉8月13日下午省教育考试院召开2018年普通高校招生录取工作的第五次新闻发布会通报高职(专科)批次的投档录取工作情况本科批次录取情况截止8月8日,提前批本科、国家专项本科、第一批本科和第二批本科4个本科批次的录取工作顺利结束,共录取考生151502名,按科类分:文史类38462名,理工类90654名,艺术类18985名,体育类2644名,“三校生”本科757名。高职(专科)批次投档录取情况..._江西高考高职计算机专业分数线

Unity 2019 Android与Unity通信 UnityPlayerActivity找不到相关问题记录_unity导出android工程报错unityplayeractivity找不到unityplaye-程序员宅基地

文章浏览阅读4.9k次,点赞2次,收藏7次。解决思路:https://blog.csdn.net/LM514104/article/details/108518253需将C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player下的UnityPlayerActivity直接拖入安卓工程MainActivity(继承于UnityPlayerActivity)的目录下。之后打包出的arr只需获取里面的AndroidMani_unity导出android工程报错unityplayeractivity找不到unityplayer

Efficient detection under varying illumination conditions and image plane rotations_人脸光照不变特征-程序员宅基地

文章浏览阅读596次。摘要本文主要研究了不同光照和姿态下的兰伯曲面目标的检测问题。我们提供了一种新的检测方法,该方法通过对训练集中少量图像的不同光照进行建模;这将自动消除光照效果,允许快速的光照不变检测,而不需要创建一个大型的训练集。实验证明,该方法很好地“适应”了之前关于在不同光照下建模物体外观集的工作。在实验中,即使在存在显著阴影的情况下,在45范围内的图像平面旋转和各种不同光照下,也能正确地检测到目标。1、简介姿态和光照的微小变化会产生物体外观的巨大变化。在[9,16,19,20]中研究了不同类别几何变换或不同_人脸光照不变特征

【ROS2机器人入门到实战】_ros2机器人编程实战 pdf-程序员宅基地

文章浏览阅读1.3w次,点赞35次,收藏421次。1.ROS2前世今生2.ROS与ROS2对比3.动手安装ROS24.ROS2初体验。_ros2机器人编程实战 pdf

Android Studio 控制台中文乱码,解决方案都在这里了,完美解决_android studio 乱码-程序员宅基地

文章浏览阅读1.3w次,点赞24次,收藏35次。android studio 中文乱码问题,统一设置 UTF-8_android studio 乱码

第4章-Quartus 软件和 USB-Blaster 驱动安装_fpga的usb blaster安装驱动-程序员宅基地

文章浏览阅读1.9k次。接下来,我们以 Quartus II 13.0 版本为例,手把手教会各位实现 Quartus II 开发软件的。芯片,所以要使用 Altera 提供的配套开发软件 Quartus II,我们使用的是 13.0 版本---如图 4-11 所示,安装信息包括 Quartus II 软件。先, QaurtusII_13.0 版本是众多初学者习惯使用的版本,操作界面比较传统,众多教程都针。立安装器件库,组件的选择不包括器件库,如图 4-10 所示。另一种是独立安装,开发软件安装完毕后再进行器件库的安装,独。_fpga的usb blaster安装驱动

推荐文章

热门文章

相关标签