14
套套套 套套套 API API 套套 套套

套接字 API 调用

  • Upload
    africa

  • View
    58

  • Download
    0

Embed Size (px)

DESCRIPTION

套接字 API 调用. 创建套接字. result= socket (pf, type, protocol) pf 为协议族( protocol family )。套接字并不局限于使用 TCP/IP ,而是可以支持各种协议族。当前的协议族包括 TCP/IP 互联网( PF_INET )、 Xerox 公司的 PUP 互联网( PF_PUP )、 Apple 公司的 AppleTalk 网络( PF_APPLETALK )和 UNIX 文件系统( PF_UNIX )。 - PowerPoint PPT Presentation

Citation preview

Page 1: 套接字 API 调用

套接字套接字 APIAPI 调用调用

Page 2: 套接字 API 调用

创建套接字创建套接字result= socket (pf, type, protocol)result= socket (pf, type, protocol)

pfpf 为协议族(为协议族( protocol familyprotocol family )。套接字并不局)。套接字并不局限于使用限于使用 TCP/IPTCP/IP ,而是可以支持各种协议族。当,而是可以支持各种协议族。当前的协议族包括前的协议族包括 TCP/IPTCP/IP 互联网(互联网( PF_INETPF_INET )、)、XeroxXerox 公司的公司的 PUPPUP 互联网(互联网( PF_PUPPF_PUP )、)、 AppleApple公司的公司的 AppleTalkAppleTalk 网络(网络( PF_APPLETALKPF_APPLETALK )和)和UNIXUNIX 文件系统(文件系统( PF_UNIXPF_UNIX )。)。typetype 为制定所需的通信类型。包括可靠数据流交为制定所需的通信类型。包括可靠数据流交付服务(付服务( SOCK_STREAMSOCK_STREAM )和无连接数据报交)和无连接数据报交付服务(付服务( SOCK_DGRAMSOCK_DGRAM )和允许有特权的用户)和允许有特权的用户访问网络底层协议和网络接口的原始类型(访问网络底层协议和网络接口的原始类型( SOCSOCK_RAWK_RAW )。 )。

Page 3: 套接字 API 调用

套接字的继承和终止套接字的继承和终止close(socket)close(socket)

操作系统创建子进程时,子进程将继承父进程打操作系统创建子进程时,子进程将继承父进程打开的套接字。开的套接字。父子进程拥有对该套接字同样的访问权,并且能父子进程拥有对该套接字同样的访问权,并且能共享访问套接字。共享访问套接字。系统对每个套接字的引用进行计数,每增加一个系统对每个套接字的引用进行计数,每增加一个进程访问套接字,则计数加进程访问套接字,则计数加 11 。。当进程完成对套接字的使用时,对套接字的使用当进程完成对套接字的使用时,对套接字的使用调用调用 closeclose 进行关闭。进行关闭。closeclose 调用将减少套接字的引用计数,并在计数值调用将减少套接字的引用计数,并在计数值为为 00 时删除套接字。时删除套接字。

Page 4: 套接字 API 调用

绑定本地地址绑定本地地址bind(socket, localaddr, addrlen )bind(socket, localaddr, addrlen )

套接字创建时未关联本地或目的地址套接字创建时未关联本地或目的地址套接字与网络地址绑定的机制套接字与网络地址绑定的机制不同协议可能具有不同含义。对不同协议可能具有不同含义。对 TCP/IPTCP/IP 协协议,绑定的内容包括议,绑定的内容包括 IPIP 地址和端口号。地址和端口号。

Page 5: 套接字 API 调用

地址绑定结构地址绑定结构

地址族 地址八位组 0-1

地址八位组 2-5

地址八位组 6-9

地址八位组 10-13

0 16 31

Page 6: 套接字 API 调用

IPIP 地址绑定结构地址绑定结构

地址族( 2 ) 协议端口IP 地址

未用( 0 )未用( 0 )

0 16 31

Page 7: 套接字 API 调用

连接到目的地址连接到目的地址connect(socket, destaddr, addrlen)connect(socket, destaddr, addrlen)

初始创建的套接字处于一种未连接的状态,即套初始创建的套接字处于一种未连接的状态,即套接字未与任何外地目的地址关联。接字未与任何外地目的地址关联。connectconnect 将套接字关联到一个永久的目的地址,将套接字关联到一个永久的目的地址,从而让套接字进入已连接状态。从而让套接字进入已连接状态。应用程序在进行可靠数据流传输时,必须调用应用程序在进行可靠数据流传输时,必须调用 coconnectnnect 建立一个连接。建立一个连接。参数参数 socketsocket 为绑定的套接字描述符。为绑定的套接字描述符。 destaddrdestaddr为目的地址的结构。参数为目的地址的结构。参数 addrlenaddrlen 是指定地址长是指定地址长度的整数,以八位组为单位。度的整数,以八位组为单位。

Page 8: 套接字 API 调用

发送数据发送数据在套接字建立之后,应用程序就可以通过在套接字建立之后,应用程序就可以通过系统调用使用套接字传输数据。系统调用使用套接字传输数据。五个系统调用:五个系统调用: send,sendto,sendmsg,writsend,sendto,sendmsg,writee 和和 writevwritev 。。其中其中 sendsend 、、 writewrite 和和 writevwritev 只用于已经建只用于已经建立连接的套接字,它们在调用时,不需要,立连接的套接字,它们在调用时,不需要,也不允许指定目的地址。也不允许指定目的地址。

Page 9: 套接字 API 调用

套接字接收数据套接字接收数据与五个传输数据的系统调用相对应与五个传输数据的系统调用相对应五个系统调用: 五个系统调用: recv,recvfrom,recvmsg ,rrecv,recvfrom,recvmsg ,readead 和和 readvreadv 。。

Page 10: 套接字 API 调用

获得本地和远程套接字地址获得本地和远程套接字地址进程可以调用进程可以调用 getpeernamegetpeername 来获得套接字来获得套接字连接的目的方的地址,调用格式如下:连接的目的方的地址,调用格式如下:

getpeername(socket, destaddr, addrlen)getpeername(socket, destaddr, addrlen)

进程也可以通过进程也可以通过 getsocknamegetsockname 获得套接字获得套接字连接的本地地址,调用格式如下:连接的本地地址,调用格式如下:

getsockname(socket, localaddr, addrlen)getsockname(socket, localaddr, addrlen)

Page 11: 套接字 API 调用

获得并设置套接字选项获得并设置套接字选项应用程序可以控制套接字的机制。比如设置超时应用程序可以控制套接字的机制。比如设置超时参数,控制缓冲区空间的分配,控制是否允许发参数,控制缓冲区空间的分配,控制是否允许发送广播,或者控制带外数据的处理等。送广播,或者控制带外数据的处理等。应用程序可以通过应用程序可以通过 setsockoptsetsockopt 设置相应的选项,设置相应的选项,也可以通过也可以通过 getsockoptgetsockopt 获取当前的设置情况。获取当前的设置情况。设置调用的格式如下:设置调用的格式如下:

setsockopt(socket, level, optionid, optionval, length)setsockopt(socket, level, optionid, optionval, length)

获取调用的格式如下:获取调用的格式如下: getsockopt(socket, level, optionid, optionval, length)getsockopt(socket, level, optionid, optionval, length)

Page 12: 套接字 API 调用

指明服务器的队列长度指明服务器的队列长度listen( socket, qlength)listen( socket, qlength)

服务器进程在处理一个请求的时候需要消耗一些服务器进程在处理一个请求的时候需要消耗一些时间,在此期间可能系统又有新的请求到来。时间,在此期间可能系统又有新的请求到来。为了避免协议拒绝或丢弃传入的请求,服务器必为了避免协议拒绝或丢弃传入的请求,服务器必须告诉底层协议软件,它希望让来不及处理的请须告诉底层协议软件,它希望让来不及处理的请求排队等待。求排队等待。如果系统请求的队列已满,额外的请求将被丢弃。如果系统请求的队列已满,额外的请求将被丢弃。该系统调用仅用于可靠数据流交付服务的套接字。该系统调用仅用于可靠数据流交付服务的套接字。

Page 13: 套接字 API 调用

服务器如何接收连接服务器如何接收连接newsock=accept(socket, addr, addrlen)newsock=accept(socket, addr, addrlen)

服务器进程使用系统调用服务器进程使用系统调用 socketsocket 、、 bindbind 和和 listenlisten 创建一创建一个套接字,将它绑定到熟知端口,并指定连接请求的排队个套接字,将它绑定到熟知端口,并指定连接请求的排队长度。但是套接字并没有连接到外部目的地址,而是处于长度。但是套接字并没有连接到外部目的地址,而是处于一种等待状态,准备接收来自任意客户的连接请求。一种等待状态,准备接收来自任意客户的连接请求。使用系统调用使用系统调用 acceptaccept 进入阻塞,直到到达一个连接请求。进入阻塞,直到到达一个连接请求。socketsocket 为等待连接的套接字描述符。参数为等待连接的套接字描述符。参数 addraddr 是存放地是存放地址信息的结构指针,参数址信息的结构指针,参数 addrlenaddrlen 是一个整数的指针,返是一个整数的指针,返回地址的长度,回地址的长度, newsocknewsock 为新的套接字描述符。为新的套接字描述符。原来的套接字仍然保持等待状态,以便继续接收其他的请原来的套接字仍然保持等待状态,以便继续接收其他的请求。求。

Page 14: 套接字 API 调用

本节结束本节结束