高级套接字函数(五)

recv和send

  recv和send函数提供了和read和write差不多的功能.不过它们提供了第四个参数来控制读写操作.

  int recv(int sockfd,void *buf,int len,int flags)

  int send(int sockfd,void *buf,int len,int flags)

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

  _______________________________________________________________
  | MSG_DONTROUTE | 不查找路由表 |
  | MSG_OOB | 接受或者发送带外数据 |
  | MSG_PEEK | 查看数据,并不从系统缓冲区移走数据 |
  | MSG_WAITALL | 等待所有数据 |
  |--------------------------------------------------------------|

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

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

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

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

   1)当读到了指定的字节时,函数正常返回.返回值等于len

  2)当读到了文件的结尾时,函数正常返回.返回值小于len

  3)当操作发生错误时,返回-1,且设置错误为相应的错误号(errno)

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

recvfrom和sendto

  这两个函数一般用在非套接字的网络程序当中(UDP),我们已经在前面学会了.

recvmsg和sendmsg

  recvmsg和sendmsg可以实现前面所有的读写函数的功能.

  int recvmsg(int sockfd,struct msghdr *msg,int flags)

  int sendmsg(int sockfd,struct msghdr *msg,int flags)

  struct msghdr

  {
    void *msg_name;
    int msg_namelen;
    struct iovec *msg_iov;
    int msg_iovlen;
    void *msg_control;
    int msg_controllen;
    int msg_flags;
  }

  struct iovec

  {
    void *iov_base; /* 缓冲区开始的地址 */
    size_t iov_len; /* 缓冲区的长度 */
  }

  msg_name和 msg_namelen当套接字是非面向连接时(UDP),它们存储接收和发送方的地址信息.msg_name实际上是一个指向struct sockaddr的指针,

msg_name是结构的长度.当套接字是面向连接时,这两个值应设为NULL. msg_iov和msg_iovlen指出接受和发送的缓冲区内容.msg_iov是一个结构指针,

msg_iovlen指出这个结构数组的大小. msg_control和msg_controllen这两个变量是用来接收和发送控制数据时的 msg_flags指定接受和发送的操作选项.和recv,send的选项一样

套接字的关闭

  关闭套接字有两个函数close和shutdown.用close时和我们关闭文件一样.

shutdown

  int shutdown(int sockfd,int howto)

  TCP连接是双向的(是可读写的),当我们使用close时,会把读写通道都关闭,有时侯我们希望只关闭一个方向,这个时候我们可以使用shutdown.

  针对不同的howto,系统回采取不同的关闭方式.

  howto=0这个时候系统会关闭读通道.但是可以继续往接字描述符写.

  howto=1关闭写通道,和上面相反,着时候就只可以读了.

  howto=2关闭读写通道,和close一样 在多进程程序里面,如果有几个子进程共享一个套接字时,如果我们使用shutdown, 那么所有的子进程都不能够操作了,

  这个时候我们只能够使用close来关闭子进程的套接字描述符.

原文地址:https://www.cnblogs.com/Malphite/p/10660385.html

时间: 2024-10-28 07:01:49

高级套接字函数(五)的相关文章

六、高级套接字函数

网络通信的高级函数 1.recv和send 函数原型: int recv(int sockfd,void *buf,int len,int flags); int send(int sockfd,void *buf,int len,int flags); 前面的三个参数和read.write一样,第四个参数可以是0或者是以下的组合: MSG_DONTROUTE 不查找路由表 MSG_OOB 接收或者发送外带数据 MSG_PEEK 查看数据,并不从系统缓冲区移走数据 MSG_WAITALL 等待所

高级套接口-(sendmsg和recvmsg)

Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类). 那么,如果我们要把"属性"(property)和"方法"(method),封装成一个对象,甚至要从原型对象生成一个实例对象,我们应该怎么做呢? 一. 生成对象的原始模式 假定我们把猫看成一个对象,它有"名字"和"颜色"两个属性. var C

1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数,socket相关函数,TCP server和client

 1  Socket编程 socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP 地址+端口号"就称为socket. 在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接.socket本身有"插座"的意思,因此用来描述网络连 接的一对一关系. TCP/IP协议最早在BSD UNIX上实现,

详解基本TCP套接字函数

以下讲解基本TCP套接字函数. 1.socket 函数   指定期望的通信协议类型. #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int socket(int domain, int type, int protocol); 返回:若成功则为非负描述符,出错则为-1. 参数说明:  domain:   指明协议族,也称为协议域,是一个常值.           AF_INET           IP

路由器欺骗(原始套接字五)

Windows系统保持着一张已知的路由器列表,我们可以使用route PRINT命令显示路由表,下面是笔者的电脑运行route PRINT命令后的结果: 列表中到达某目的节点的第一项Gateway为默认路由器,如果默认路由器关闭,则位于列表第二项的路由器成为缺省路由器.缺省路由向发送者报告另一条到特定主机的更短路由,就是ICMP重定向.攻击者可利用ICMP重定向报文破坏路由,并伪装成路由器截获所有到某些目标网络或全部目标网络的IP数据包,进行窃听. 显然,前文中我们只是讲解了发送ICMP Pin

《javascript高级程序设计》第五章知识点总结

第五章知识点总结 1.object类型 访问对象的方法:①点表示法        (people.name) :      ②方括号表示法         (people[name]). 常用方法:hasOwnProperty()         用于检查给定属性在当前对象实例中是否存在 isPrototypeOf()              用于检测传入的对象是否传入对象原型 toString()                        返回对象的字符串表示 valueOf()    

Python高级之Socket 探索(五)

目录: 面向对象 反射 socket 一.面向对象 方法 方法包括:普通方法.静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同. 普通方法:由对象调用:至少一个self参数:执行普通方法时,自动将调用该方法的对象赋值给self:类方法:由类调用: 至少一个cls参数:执行类方法时,自动将调用该方法的类复制给cls:静态方法:由类调用:无默认参数: class Aniaml: count = 10 def __init__(self,name): self.name = name

读书笔记 - js高级程序设计 - 第十五章 使用Canvas绘图

读书笔记 - js高级程序设计 - 第十三章 事件 canvas 具备绘图能力的2D上下文 及文本API 很多浏览器对WebGL的3D上下文支持还不够好 有时候即使浏览器支持,操作系统如果缺缺乏必要的绘图驱动程序,则浏览器即使支持了也没用   <canvas> var drawing = document.getElementById("drawing"); if( drawing.getContext ){ drawing.getContext("2d"

《javascript高级程序设计》笔记五(转载)

第五章 引用类型 在上一章中,作者就在说变量的值的时候,提到过引用类型这个概念.JavaScript中存在基本类型和引用类型,其中引用类型很重要,这里有许多我们需要注意的东西.从目录中,可以看到JavaScript中的引用类型有:Object类型.Array类型.Data类型.RegExp类型.Function类型.基本内置类型.单体内置类型.下面我将整理这里的知识点. ①引用类型是一种数据结构,用于将数据和功能组织在一起,它也被称为类,但JavaScript中却不支持类和接口都基本机构,故称之