什么是套接口?

什么是套接口?socket、套接口、套接口描述符之间的关系

  UNP 的译者在 p6 中的译注中提到:socket 一词应该译成“套接口”,理由如下:首先,作为网络编程 API 之一的套接口(sockets.注意这种用法总是采用复数形式,例如 sockets API、sockets library)跟 XTI 一样,是应用层到传输层或其他协议层的访问接口。其次,具体使用的套接口时与 unix 管道的某一端类似的东西,我们既可以往这个“口”写数据,也可以从这个“口”读取数据。最后,套接口函数使用套接口描述字访问具体的套接口,如果把套接口描述字的简称 socketfd 译成“套接字”倒比较合适。从这个意义上来讲,一个套接口可以对应多个套接字,因为 unix 的描述字既可以复制,也可以继承,反过来,一个套接字对应且只对应一个套接口。

如何创建套接口?

  unix下通过 socket 函数创建套接口,该函数原型是:

  int socket(int family, int type, int protocol)。

  其中,family 参数指明协议族,它是 AF_INET(IPv4 协议)、AF_INET6(IPv6)协议、AF_LOCAL()、AF_ROUTE(路由套接口)、AF_KEY(密钥套接口)中的一种。

  其中, type 指明套接口类型,它是SOCK_STREAM(字节流套接口)、SOCK_DGRAM(数据报套接口)、SOCK_SEQPACKET(有序分组套接口)、SOCK_RAW(原始套接口)中的一个。

  其中,protocol 是 IPPROTO_TCP( TCP 协议)、IPPROTO_UDP( UDP 协议)、IPPROTO_SCTP(SCTP协议)中的一种。

  如果创建成功返回套接口描述符,简称套接字

套接口用来做什么?

   在客户端:通过 connet() 用来与服务器建立连接。connet() 函数原型如下:

  int connec(int sockfd, const struct socktaddr *servaddr, socklen_t addrlen); 

  其中,sockfd 就是套接口描述符(用来描述套接口)。

  其中,servaddr 是套接口地址结构,这个结构用来指定 connect() 要连接的服务器的 IP 和 端口号。

  其中,addrlen 时套接口地址结构的大小。

  由于 connect() 函数要在客户端与服务器端建立连接,所以在调用 connect() 的时候会激发三次握手:1.主动请求连接方向被动请求连接方发送一个 SYN 分节,此时主动方处于 SYN_SENT 状态,如果被动方收到 SYN 分节,并返回一个 ACK 和 一个自己的 SYN,此时被动方处于SYN_RCVD 状态。调用 connect() 的主动方接受到被动方回应的 ACK 后,connect() 返回 0(表示成功),否则回返回 -1(出错)。connect() 成功返回后,主动方处于 ESTABLISHED 状态,表示连接已经建立。并向被动方发送一个 ACK(用来回应被动方发送的 SYN 分节)。

  在服务器端:在服务器端稍微复杂一点点,要比客户端多两个步骤:

  1、用 bind() 函数将一个本地协议地址赋予一个套接口。对于网际地址时 32 为的 IPV4地址或 128 位的 IPV6 地址与 16 位的 TCP 或 UDP 端口号的组合。bind() 函数原型如下:

  int bind(int sockfd,const struct sockaddr *myaddr ,socklen_t addrlen);

  bind() 函数的原型和 connect() 一样,但作用还是有差别的。connect() 是将 sockfd 与套接口地址结构对应的服务器建立连接,而 bind() 是将 sockfd 与本地套接口地址结构进行绑定。

  2、调用 listen() 函数将套接口变成监听套接口,listen() 原型如下:

  int listen(int sockfd, int backlog);

  其作用有两个:a.将一个未连接的套接口转换成一个被动套接口,只是内核应该接受指向该套接口的的连接请求。并使套接口从 closed 状态转换到 LISTEN 状态。

         b.listen() 的第二个参数规定了内核应该为相应套接口排队的最大连接个数。

  3、调用 accept() 函数在监听套接口(由listen()转化的套接口描述符)接受新连接的到达,如果没有新连接到达那么进程就投入睡眠(假设套接口为缺省的阻塞方式)。上面我说过,客户端是通过 connect() 来建立连接的,在客户端收到服务器端的 ACK时,connect() 函数返回,并且发送一个 ACK,当服务器端接受到这个 ACK 时,此时三次握手完成。连接建立完成,新连接到达,此时,服务器端的监听套接口转换成 ESTABLISHED 状态,accept() 成功返回。

  accept() 函数原型如下:int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);

  其中, sockfd 时监听套接口,cliaddr 是已连接的对端进程(客户)的协议地址。addrlen 是值-结果参数,是内存存在该套接口地址结构(cliaddr)的确切字节数。

  accept() 返回非负描述符,我们称其为已连接套接口描述符。一定要区别监听套接口描述符和已连接套接口描述符,一般来说服务器在其生命周期内只创建一个监听套接口描述符,而内核为每个由服务器进程接受的客户连接创建一个已连接套接口。

什么是套接口?

时间: 2024-10-31 22:23:48

什么是套接口?的相关文章

套接口编程简介

1.套接口地址结构 POSIX规范只需要结构中的三个成员:sin_family.sin_addr.sin_port.其中sin_addr又是一个结构 2.通用套接口地址结构 套接口函数被定义为采用指向通用套接口地址结构的指针.由于套接口函数的定义并没有使用void*指针类型, 所以调用套接口函数时必须进行强制类型转换. 使用通用套接口地址结构的原因:内核必须依据通用套接口地址结,检查sin_family的值来确定结构的类型 3.字节排序函数 多字节数据在内存中存储有两种方法.小端字节序把低字节存

高级套接口-(sendmsg和recvmsg)

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

C网络编程-TCP套接口编程

只有几个基本的示例如下 建立服务端的绑定监听等过程的函数 1 #include<sys/types.h> 2 #include<sys/socket.h> 3 4 #include<netinet/in.h> 5 #include<arpa/inet.h> 6 #include<unistd.h> 7 8 #include<stdio.h> 9 #include<stdlib.h> 10 11 #include<st

套接口选项

设置和影响套接口选项的方法有 1.getsockopt和setsockopt 2.fcntl 3.ioctl getsockopt和setsockopt 这两个方法仅适用于套接字 有两种基本类型的套接口选项:打开或关闭某个特性的二进制标志,取得并返回我们可以设置或检验的特定值的选项,标有标志的列指明是否为标志选项,对于这些项,0表示关闭标志,非0表示打开标志. 并不是所有的系统的套接字都支持所有的选项,必要时候自行验证一番. 套接字的不支持分为两种 1.未实现相关的定义,比如SO_REUSEPO

fuser:用文件或者套接口表示进程

fuser:用文件或者套接口表示进程 作用:fuser命令用文件或者套接口表示进程. 用法:fuser [-a | -s | -c] [-4 | -6] [-n space] [-k [-i] [-signal]] [-muvf] name … 或 fuser -l 或 fuser -V 主要选项如下. — -a:显示在命令行指定的所有文件,默认情况下,至少被一个进程访问的文件才能显示出来. — -c:同选项-m,用于同Posix进行兼容. — -f:忽略,用于同Posix进行兼容. — -i:

Socket调用Close后如何终止套接口的问题

setsockopt 设置 SO_LINGER 选项 此选项指定函数close对面向连接的协议如何操作(如TCP).内核缺省close操作是立即返回,如果有数据残留在套接口缓冲区中则系统将试着将这些数据发送给对方. SO_LINGER选项用来改变此缺省设置.使用如下结构: struct linger { int l_onoff; /* 0 = off, nozero = on */ int l_linger; /* linger time */ }; 有下列三种情况: 1.设置 l_onoff为

套接口学习(一)实现

套接口这个概念最先由4.2BSD(1983)引入,现在已经成为一个通用的网络应用程序编程接口,受到所有操作系统的支持.套接口层位于应用程序和 协议栈之间,对应用程序屏蔽了与协议相关实现的具体细节. 通常,应用程序中调用库函数,而库函数通过系统调用进入套接口层,Linux的套接口层实现提供了一组专门的套接口系统调用,分别在对应的库函数名之上加上"sys_"前缀.此外为了体现一切皆文件的理念,Linux也允许标准I/O系统调用通过一个套接口文件描述符来读写其对应套接口上的网络连接,就像通过

unix网络编程之基本套接口编程

第一章  套接口编程简介 IPv4套接口地址:"网际套接口地址结构" 通用套接口地址结构: 套接口函数被定义为采用指向通用套接口地址结构的指针,这要求对这些函数的任何调用都必须将指向特定于协议的套接口地址结构的指针类型转换成指向通用套接口地址结构的指针: 套接口地址结构的比较: 值-结果参数: 当把套接口地址结构传递给套接口函数时,总是通过指针来传递的,即传递的是一个指向结构的指针. 1, 从进程到内核传递套接口地址结构有3个函数:bind.connect.sendto,这3个函数的一

UNPv1第四章:基本TCP套接口编程

1 socket函数 为了执行网络I/O,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型 #include <sys/socket.h> int socket (int family, int type, int protocol); //返回:若成功则为非负描述符,若出错则为-1 其中family指明协议族,type参数指明套接字类型,protocol参数应该设为某个(见下图)协议类型常值,或者设为0,以选择所给定family和type组合的系统默认值 socket