建立好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. 【转】深入理解Java的接口和抽象类

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

  2. Splunk安装部署基础篇

    Splunk安装(以4.3.4版本为例) 下载splunk软件包,并解压,直接启动即可. --Linux-x86_64.tgz -C /optcd /opt/splunk/bin./splunk st ...

  3. java之JMS

    一.简介:JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进 ...

  4. Pthreads Hello World,忙等待,互斥量

    ▶ 一个简单的 Pthreads 程序(不按照<并行程序设计导论>中的程序来写) ● 代码 #include <stdio.h> #include <pthread.h& ...

  5. springmvc怎么在启动时自己执行一个线程

    之前使用springmvc的时候,都是写好controller和对应的数据库操作. 外界发请求的时候,controller进行一堆操作后返回相应的json数据. 似乎springmvc就是外界驱动的一 ...

  6. Maven(一) Maven3 的安装与配置

    Maven的安装以及环境变量的配置: a).在安装maven之前,先确保已经安装JDK1.7及以上版本,并且配置好JDK的环境变量. b).下载maven3,下载地址:http://maven.apa ...

  7. 解决opencv3运行opencv2代码时报错的修改备忘录

    虽然opencv3是基于opencv2进行开发的(一部分opencv2代码在opencv3中还能正常运行),但opencv3自身也做了部分修改,而目前网上很多教程还是基于opencv2的函数API来编 ...

  8. C# Action

    Action<T> Delegate Encapsulates a method that has a single parameter and does not return a val ...

  9. ajax406错误

    如上,ajax请求时一直返回error,但是后台已经正确返回.网上给出的解决办法是spring3.*的,但我的是sppring 4.*的,应该不适用,我也没试. 思索一下,406 not accept ...

  10. Solidity根据精度来表示浮点数

    https://stackoverflow.com/questions/42738640/division-in-ethereum-solidity/42739843 pragma solidity ...