建立好TCP连接后,就可以把得到的套接字当做文件描述符来使用,由此,联系到网络程序里的基本读写函数,write、read;

l write函数:

Ssize_t write(int fd,const void *buf,size_t nbytes);

Write函数将buf中的nbytes字节内容写入到文件描述符中,成功返回写的字节数,失败返回-1.并设置errno变量。在网络程序中,当我们向套接字文件描述写数据时有两种可能:

1. write的返回值大于0,表示写了部分数据或者是全部的数据,这样用一个while循环不断的写入数据,但是循环过程中的buf参数和nbytes参数是我们自己来更新的,也就是说,网络编程中写函数是不负责将全部数据写完之后再返回的,说不定中途就返回了!

2. 返回值小于0,此时出错了,需要根据错误类型进行相应的处理。

如果错误是EINTR表示在写的时候出现了中断错误,如果是EPIPE表示网络连接出现了问题。

l read函数:

Ssize_t read(int fd,void *buf,size_t nbyte);

Read函数是负责从fd中读取内容,当读取成功时,read返回实际读取到的字节数,如果返回值是0,表示已经读取到文件的结束了,小于0表示是读取错误。

如果错误是EINTR表示在写的时候出现了中断错误,如果是EPIPE表示网络连接出现了问题。

有了上面的两个函数,我们就可以向客户端或者是服务器端进行数据传输了!比如我要传送一个结构体,可以使用下面的方法:

客户端向服务器:

Struct student stu;

Write(sock,(void *)&stu,sizeof(struct student));

服务器读:

Char buffer[sizeof(struct student)];

Struct *my_student;

Read(sock,(void *)buffer,sizeof(struct student));

My_student=(struct student)buffer;

在网络上传递数据时,我们一般把数据转换为char类型,接收的时候也是一样的的。没必要在网络上传递指针。

l Recv函数和send函数:

Recv函数和read函数提供了read和write函数一样的功能,不同的是他们提供了四个参数。

Int recv(int fd,void *buf,int len,int flags)

Int send(int fd,void *buf,int len,int flags)

前面的三个参数和read、write函数是一样的。第四个参数可以是0或者是一下组合:

Ø MSG_DONTROUTE:不查找表

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

Ø MSG_OOB:接受或者发生带外数据

表示可以接收和发送带外数据。

Ø MSG_PEEK:查看数据,并不从系统缓冲区移走数据

是recv函数使用的标志,表示只是从系统缓冲区中读取内容,而不清楚系统缓冲区的内容。这样在下次读取的时候,依然是一样的内容,一般在有过个进程读写数据的时候使用这个标志。

Ø MSG_WAITALL:等待所有数据

是recv函数的使用标志,表示等到所有的信息到达时才返回,使用这个标志的时候,recv返回一直阻塞,直到指定的条件满足时,或者是发生了错误。

write/read/send/receive函数比较的更多相关文章

  1. I.MX6 Android Linux UART send receive with multi-thread and multi-mode demo

    /******************************************************************************************* * I.MX6 ...

  2. 8-EasyNetQ之Send & Receive

    鉴于Publish/Subsrcibe和Request/Response模式是位置透明的,在这个方面,你不需要去指定消息的消费者具体所处的位置,Send/Receive模式是特别针对通过命名队列来设计 ...

  3. 关于send message 函数

    Windows是一个消息驱动模式的系统,SendMessage 是应用程序和应用程序之间进行消息传递的主要手段之一.由于 SendMessage 函数的参数选项过于繁多,因此很有必要作一个汇总,分门别 ...

  4. send/receive h264/aac file/data by rtp/rtsp over udp/tcp

    一.安装一些必要的调试工具 1.vlc安装sudo apt-get install vlcsudo apt-get install vlc-nox 2.ffmpeg安装,带ffplay,ffplay依 ...

  5. EasyNetQ使用(四)【Request与Response,Send与Receive】

    EasyNetQ也支持Request/Response这种方式的消息模式.这种方式很容易在client/Server应用中执行,客户端发送一个请求到服务器,服务器然后处理请求后返回一个响应.和传统的R ...

  6. PHP7函数大全(4553个函数)

    转载来自: http://www.infocool.net/kb/PHP/201607/168683.html a 函数 说明 abs 绝对值 acos 反余弦 acosh 反双曲余弦 addcsla ...

  7. workerman 的回调函数

    接下来,记录一下workerman 的回调函数 <?php /** * Created by PhpStorm. * User: zeopean * Date: 2016-08-26 * Tim ...

  8. Socket之listen() receive()

    socket.listen([backlog]) 相比listen方法,它俩就好理解多了,一个是Client用于连接Server的方法,一个是Server用于接收Client的连接申请的方法.  但事 ...

  9. 理解Python协程:从yield/send到yield from再到async/await

    Python中的协程大概经历了如下三个阶段:1. 最初的生成器变形yield/send2. 引入@asyncio.coroutine和yield from3. 在最近的Python3.5版本中引入as ...

随机推荐

  1. 异步FIFO中空满信号如何产生?

    异步FIFO中,空满信号该如何产生呢? 在复位的时候,读指针和写指针相等,读空信号有效(这里所说的指针其实就是读地址.写地址)当读指针赶上写指针的时候,写指针等于读指针意味着最后一个数据被读完,此时读 ...

  2. MySQL 多表关联更新及删除

    目录: <MySQL中的两种临时表> <MySQL 多表关联更新及删除> <mysql查询优化之三:查询优化器提示(hint)> 一.      多表关联更新 问题 ...

  3. js实现的快速排序

    快速排序是一种平均性能非常优秀的排序算法,在很多场合都会应用到他. 了解快速排序于对开放高效率的软件有很重要的作用. 但是有不少的书本讲得并不是很清楚,而且不同的教材的实现方式也不尽相同, 我这里将最 ...

  4. mysql迁移之巨大数据量快速迁移方案

    mysql迁移之巨大数据量快速迁移方案-增量备份及恢复 --chenjianwen 一.前言: 当mysql库的大小达到几十个G或者上百G,迁移起来是一件非常费事的事情,业务中断,导出导入耗费大量的时 ...

  5. 使用JdbcTemplate访问数据库

    参考源端:https://blog.csdn.net/liaodehong/article/details/76974827 今天用Spring Boot访问一下数据库,并且把数据返回到页面中,进行增 ...

  6. 原生态Vim使用快捷键

    我的第一篇博客,凌晨2点加班不想睡,随便写点.本人菜鸟一个,努力学习,争取成为大神.. 第一篇写点什么东西呢,我目前是搞运维的,俗话说"工欲善其事必先利其器",Vim作为最基本的工 ...

  7. upstream prematurely closed connection while reading response header from upstream

    upstream prematurely closed connection while reading response header from upstream nginx配置uwsgi的时候  ...

  8. sudo免密码

    很多都是修改/etc/sudoers权限为740再加上一句 ALL=NOPASSWD:ALL 或者加一句 yourname ALL=(ALL) NOPASSWD: ALL 然后权限改回440 先说第一 ...

  9. U3D+SVN: 两份相同资源放在不同目录下导致META的更改

    U3D+SVN: 两份相同资源放在不同目录下导致META的更改. 实际情形:将地图文件map拷一份放在其它目录,回到UNITY编辑器,载入完成后加到磁盘,看到map文件夹下的所有meta都变红了. r ...

  10. tomcat启动一闪而过,调试tomcat

    参考地址:https://blog.csdn.net/baidu_32739019/article/details/64155136