六、高级套接字函数

网络通信的高级函数

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 等待所有数据

MSG_DONTROUTE:send函数使用的标志。这个标志告诉IP协议,目的主机在本地网络上面,没有必要查找路由表。这个标志一般用网络诊断和路由程序里面。
MSG_OOB:表示可以接收和发送带外的数据。

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

MSG_WAITALL:recv函数的使用标志,表示等到所有的信息到达时才返回。使用这个标志的时候recv回一直阻塞,直到指定的条件满足或者是发生了错误。
1)当读到了指定的字节时,函数正常返回.返回值等于len 。
2)当读到了文件的结尾时,函数正常返回.返回值小于len 。
3) 当操作发生错误时,返回-1,且设置错误为相应的错误号(errno)。

如果flags为0,则和read、write一样的操作。

2、recvfrom和sendto

五、用户数据报传输(UDP)中已经讲到,在此不再解释。

3、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_namelen是结构的长度。当套接字是面向连接时,这两个值应设为NULL 。
msg_iov和 msg_iovlen指出接受和发送的缓冲区内容。msg_iov是一个结构指针,msg_iovlen指出这个结构数组的大小。
msg_control和msg_controllen这两个变量是用来接收和发送控制数据时的msg_flags指定接受和发送的操作选项,和 recv、send的选项一样。
4、套接字的关闭

关闭套接字有两个函数close和shutdown。

用close时和我们关闭文件一样:close(sockfd);

shutdown的函数原型为:

int shutdown(int sockfd,int howto);

TCP连接是双向的(是可读写的)。当我们使用close时,会把读写通道都关闭,有时侯我们希望只关闭一个方向,这个时候我们可以使用shutdown。针对不同的howto,系统回采取不同的关闭方式:

  • howto=0 这个时候系统会关闭读通道.但是可以继续往接字描述符写。
  • howto=1 关闭写通道,和上面相反。
  • howto=2 关闭读写通道,和close一样在多进程程序里面。如果有几个子进程共享一个套接字时。如果我们使用shutdown, 那么所有的子进程都不能够操作了,这个时候我们只能够使用close来关闭子进程的套接字描述符。
时间: 2024-10-12 09:03:47

六、高级套接字函数的相关文章

高级套接字函数(五)

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或者是以下的组合 __________________________________________________

高级套接口-(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

Unix网络编程(六)高级I/O技术之复用技术 select

I/O复用技术 本文将讨论网络编程中的高级I/O复用技术,将从下面几个方面进行展开: a. 什么是复用技术呢? b. 什么情况下需要使用复用技术呢? c. I/O的复用技术的工作原理是什么? d. select, poll and epoll的实现机制,以及他们之间的区别. 下面我们以一个背景问题来开始: 包括在以前的文章中我们讨论的案例都是阻塞式的I/O包括(fgetc/getc, fgets/gets),即当输入条件未满足时进程会阻塞直到满足之后进行读取,但是这样导致的一个 问题是如果此时进

mybatis入门基础(六)----高级映射(一对一,一对多,多对多)

一:订单商品数据模型 1.数据库执行脚本 创建数据库表代码: 1 CREATE TABLE items ( 2 id INT NOT NULL AUTO_INCREMENT, 3 itemsname VARCHAR(32) NOT NULL COMMENT '商品名称', 4 price FLOAT(10,1) NOT NULL COMMENT '商品定价', 5 detail TEXT COMMENT '商品描述', 6 pic VARCHAR(64) DEFAULT NULL COMMENT

io操作-套接字函数/数据打包

函数[1] sockfd.type 套接字类型 [2] sockfd.family 套接字地址类型 [3] sockfd.getsockname() 获取套接字绑定地址 [4] sockfd.fileno() 获取套接字的文件描述符 [5] confd.getpeername() 获取连接套接字客户端地址 ## struct模块进行数据打包struct模块作用:将一组 简单数据 进行打包,转换为bytes格式发送.或者将一组bytes格式数据,进行解析复杂数据:可以用json模块或者str()/

nginx学习六 高级数据结构之双向链表ngx_queue_t

1 ngx_queue_t简介 ngx_queue_t是nginx提供的一个轻量级的双向链表容器,它不负责存储数据,既不提供数据的内存分配,它只有两个指针负责把数据链入链表,它跟stl提供的queue不同,stl提供的queue帮助用户存储数据,用户只需要相容器里添加数据即可,而ngx_queue_t,用户必须自己提供存储数据的内存,并且必须定义一种数据结构把ngx_queue_t包含在其中,然后利用ngx_queue_t提供的函数来进行相应的操作. 2 ngx_queue_t结构及其操作 2.

Vue.js 源码分析(二十六) 高级应用 作用域插槽 详解

普通的插槽里面的数据是在父组件里定义的,而作用域插槽里的数据是在子组件定义的. 有时候作用域插槽很有用,比如使用Element-ui表格自定义模板时就用到了作用域插槽,Element-ui定义了每个单元格数据的显示格式,我们可以通过作用域插槽自定义数据的显示格式,对于二次开发来说具有很强的扩展性. 作用域插槽使用<template>来定义模板,可以带两个参数,分别是: slot-scope    ;模板里的变量,旧版使用scope属性 slot              ;该作用域插槽的nam