建立好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返回一直阻塞,直到指定的条件满足时,或者是发生了错误。

转载于:https://www.cnblogs.com/davidsguo008/p/3591522.html

write/read/send/receive函数比较相关推荐

  1. Solidity 中 receive 函数 和 callback函数分析

    在使用transfer 和 send 方法的是后需要关注一下 receive方法和callback方法. receive 接收以太函数 一个合约最多有一个 receive 函数, 声明函数为: rec ...

  2. 以太坊Solidity语言的Receive函数和Fallback回退函数详解

    Solidity语言中关于回退函数的定义: 回退函数是一个不接受任何参数也不返回任何值的特殊函数: 如果在对合约的调用中,没有其它函数与给定的函数标识符匹配时,回退函数会被调用: 每当合约接收到以太币 ...

  3. RDMA技术详解(二):RDMA Send Receive操作

    1. 前言 RDMA指的是远程直接内存访问,这是一种通过网络在两个应用程序之间搬运缓冲区里的数据的方法.RDMA与传统的网络接口不同,因为它绕过了操作系统.这允许实现了RDMA的程序具有如下特点: 绝 ...

  4. python:实现FTP发送接收ftp send receive(附完整源码)

    python:实现FTP发送接收ftp send receive from ftplib import FTP ftp = FTP("xxx.xxx.x.x") # Enter t ...

  5. 【RDMA】RDMA技术详解(二):Send Receive操作

    原文:https://blog.csdn.net/qq_21125183/article/details/86525012 英文:https://zcopy.wordpress.com/2010/10 ...

  6. 【RDMA】技术详解(二):Send Receive操作

    原文:RDMA技术详解(二):RDMA Send Receive操作_Master-TJ的个人博客-CSDN博客 英文:Quick Concepts Part 1 – Introduction to ...

  7. linux receive函数,Linux网络 - 数据包的接收过程

    的方式写入到指定的内存地址,该地址由网卡驱动分配并初始化.注: 老的网卡可能不支持DMA,不过新的网卡一般都支持. 3: 网卡通过硬件中断(IRQ)通知CPU,告诉它有数据来了 4: CPU根据中断表 ...

  8. send(),recv()函数详解

    1.send 函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP ...

  9. linux socket中 send recv函数的 flags参数

    int send(int s, const void *msg, size_t len, int flags);  flags取值有: 0: 与write()无异 MSG_DONTROUTE:告诉内核 ...

最新文章

  1. mongodb 内建用户
  2. [译] Flutter 从 0 到 1, 第二部分
  3. 可视化文本数据—词云
  4. 推荐5款好用的Linux音乐播放器
  5. android webview_在 Flutter 中使用 WebView
  6. 数据结构与算法python—5.队列及python实现与leetcode总结
  7. Windows修改键盘映射
  8. ap6212中串口蓝牙在linux下的使用记录
  9. android加载dex方法,android Dex文件的加载
  10. 干货|龙芯架构明御综合日志审计分析平台迁移技术
  11. 【微信小程序学习笔记02理解与初始准备】【实战天气微信小程序】
  12. I don't know what to say 事件的 NPM 包中奖名单,有你在用的吗?
  13. java循环引用 垃圾回收,深入解析Java垃圾回收机制
  14. 跟我StepByStep学FLEX教程------概述(原创)
  15. LOJ 10155 - 「一本通 5.2 例 3」数字转换
  16. 图形界限命令在命令行输入_设置图形界限的命令为在命令行输入
  17. directives(Directives UE 93 42 CEE)
  18. Flask--Blueprint(蓝图)简单使用笔记
  19. switchhosts的作用
  20. 对json串的解析 fastjson gson ajax异步刷新

热门文章

  1. Linux Shell 编程学习总结
  2. 图文详解asp.net自带控件
  3. React Router 黑笔记?
  4. 学习JS的心路历程-参数传递方式(上)
  5. 初始python(二)
  6. 从tabBarController的一个item上的控制器跳转到另一个item上的控制器
  7. java执行时的两个常见问题(无法加载主类)
  8. python3.4安装suds
  9. php饼图只有一个小方块_如何做出PHP数据饼图
  10. [Machine Learning]--知识点疑问汇总[持续更新中]