计算机网络编程第四讲套接字api

上传人:tian****1990 文档编号:81939722 上传时间:2019-02-22 格式:PPT 页数:29 大小:3.13MB
返回 下载 相关 举报
计算机网络编程第四讲套接字api_第1页
第1页 / 共29页
计算机网络编程第四讲套接字api_第2页
第2页 / 共29页
计算机网络编程第四讲套接字api_第3页
第3页 / 共29页
计算机网络编程第四讲套接字api_第4页
第4页 / 共29页
计算机网络编程第四讲套接字api_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《计算机网络编程第四讲套接字api》由会员分享,可在线阅读,更多相关《计算机网络编程第四讲套接字api(29页珍藏版)》请在金锄头文库上搜索。

1、计算机网络编程,第四讲 套接字API,套接字的概念 Berkeley套接字 套接字概要 套接字主要系统调用 用于整数转换的函数调用 在程序中使用套接字调用 套接字调用参数相关的符号常量,目录,计算机网络编程,电子科大计算机学院,计算机网络编程,电子科大计算机学院,什么是套接字,1. 套接字是一个主机本地应用程序所创建的, 为操作系统所控制的接口 (“门”) . 2. 应用进程通过这个接口,使用传输层提供的服务, 跨网络发送(或接收)消息. 3.Client/server模式的通信接口套接字接口.,来自UNIX系统 Berkeley套接字 ARPA要求伯克利分校将TCP/IP移植到UNIX中 需

2、要创建一个接口,便于应用程序使用这个接口 进行网络通信 尽可能使用现有的系统调用,同时添加新的系统调用支持TCP/IP。 这个系统被称为BSD UNIX (Berkeley Software Distribution),成为事实上的标准 1981提出于BSD4.1 UNIX,本书基于BSD4.4 版本,计算机网络编程,电子科大计算机学院,Berkeley套接字,考虑:接口是专门针对TCP/IP协议, 还是可以为其它协议所用呢? 方法一:定义专门支持TCP/IP通信的一些函数 方法二:定义支持一般网络通信的函数,用参数使TCP/IP通信作为一种特例 Berkeley套接字使用第二种办法,具有通用

3、性,TCP/IP是一个族PF_INET 另外,应用程序知名使用服务的类型,而不是指定协议名 争论: 通用性没有必要,使应用程序难以阅读 通用性可以使程序员免于了解协议族的细节,计算机网络编程,电子科大计算机学院,指明一个协议接口,文件描述符:进程的文件描述符表的下标。OS中每个进程对应一个文件描述符表,表中每个元素指向和文件相对应的一个内部的数据结构。 套接字和文件类似,每个活动套接字使用一个小整数标识,进程的文件描述符和套接字描述符值不能相同 socket函数:创建套接字,返回描述符(不是open函数),计算机网络编程,电子科大计算机学院,套接字概要套接字描述符,0: 1: 2: 3:,进程

4、的文件描述符表 (一个进程一张),用于文件0的内部数据结构,用于文件1的内部数据结构,用于文件2的内部数据结构,用于文件3的内部数据结构,调用socket将创建一个新的描述符条目 结构的许多字段是其他的系统调用来填,计算机网络编程,电子科大计算机学院,套接字概要针对套接字的数据结构,0: 1: 2: 3: 4:,描述符表 (一个进程一张),family: PF_INET,service: SOCK_STREAM,Local IP:,Remote IP:,Local port:,Remote port:,:,创建方式相同,使用方式不同 等待传入连接的套接字被动,如服务器套接字 发起连接的套接字主

5、动,如客户套接字 指明端点地址:创建时不指定,使用时指明 TCP/IP需要指明协议端口号和IP地址 TCP/IP协议族和地址族的对应: TCP/IP协议族:PF_INET 对应的TCP/IP的地址族:AF_INET,计算机网络编程,电子科大计算机学院,套接字概要主动套接字和被动套接字,套接字系统定义的一般化的地址结构 (地址族,该族的端点地址),计算机网络编程,电子科大计算机学院,类属地址结构,套接字的普通C定义结构 struct sockaddr u_char sa_len; u_short sa_family; char sa_data14;/14B 通用的地址结构(只是很适用于AF_IN

6、ET族中的地址),TCP/IP的地址定义 struct sockaddr_in u_char sin_len; u_short sin_family; u_short sin_port;/2B struct in_addr sin_addr;/4B char sin_zero8;/8B IP专用的结构,套接字调用分为两组: 主调用:提供下层功能的访问 实用例程:提供帮助 套接字调用带有参数,允许以多种方式来使用它们。 可被客户或服务器使用 可被TCP或UDP使用 可使用特定或非特定的远程端点地址,计算机网络编程,电子科大计算机学院,套接字API的主要系统调用,int Socket( int d

7、omain, int type, int protocol) 功能:创建一个新的套接字,返回套接字描述符 参数说明: domain:域类型,指明使用的协议栈,如TCP/IP使用的是 PF_INET type: 指明需要的服务类型, 如 SOCK_DGRAM: 数据报服务,UDP协议 SOCK_STREAM: 流服务,TCP协议 protocol:一般都取0(由系统根据服务类型选择默认的协议) 请创建一个用于TCP通信的套接字。 举例:s=socket(PF_INET,SOCK_STREAM,0),计算机网络编程,电子科大计算机学院,一些主调用的套接字API:,功能:为套接字指明一个本地端点地址

8、 TCP/IP协议使用sockaddr_in结构,包含IP地址和端口号 服务器使用它来指明熟知的端口号,然后等待连接 参数说明: Sockfd:套接字描述符,指明创建连接的套接字 my_addr:本地地址,IP地址和端口号 addrlen :地址长度 举例:bind(sockfd, (struct sockaddr *),计算机网络编程,电子科大计算机学院,int bind(int sockfd,struct sockaddr * my_addr,int addrlen),功能: 面向连接的套接字使用它将一个套接字置为被动模 式,并准备接收传入连接。用于服务器,指明某个 套接字连接是被动的 参

9、数说明: Sockfd:套接字描述符,指明创建连接的套接字 input_queue_size:该套接字使用的队列长度,指定在请求队列中允许的最大请求数 请将套接字设为被动模式,并允许最大请求数为20。 举例:listen(sockfd,20),计算机网络编程,电子科大计算机学院,int listen(int sockfd,int input_queue_size),功能:获取传入连接请求,返回新的连接的套接字描述符。 为每个新的连接请求创建了一个新的套接字,服务器只对新的连接使用该套接字,原来的监听套接字接收其他的连接请求。 新的连接上传输数据使用新的套接字,使用完毕,服务器将关闭这个套接字。

10、 参数说明: Sockfd:套接字描述符,指明正在监听的套接字 addr:提出连接请求的主机地址 addrlen:地址长度 举例:new_sockfd = accept(sockfd, (struct sockaddr *),计算机网络编程,电子科大计算机学院,int accept(int sockfd, struct sockaddr *addr, int *addrlen);,功能: 同远程服务器建立主动连接,成功时返回0,若连接失败返回1。 参数说明: Sockfd:套接字描述符,指明创建连接的套接字 Server_addr:指明远程端点:IP地址和端口号 sockaddr_len :地

11、址长度 举例(P49): connect(s,remaddr,remaddrlen),计算机网络编程,电子科大计算机学院,int connect(int sockfd,struct sockaddr *server_addr,int sockaddr_len),功能: 在TCP连接上发送数据,返回成功传送数据的长度,出错时返回1。 send会将外发数据复制到OS内核中,也可以使用send发送面向连接的UDP报文。 参数说明: sockfd:套接字描述符 data:指向要发送数据的指针 data_len:数据长度 flags:通常为0 举例(p50):send(s,req,strlen(req)

12、,0);,计算机网络编程,电子科大计算机学院,int send(int sockfd, const void * data, int data_len, unsigned int flags),功能:基于UDP发送数据报,返回实际发送的数据长度,出错时返回1 参数说明: sockfd:套接字描述符 data:指向要发送数据的指针 data_len:数据长度 flags:通常为0 remaddr:远端地址:IP地址和端口号 remaddr_len :地址长度 举例:sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *),计算机网络编程,电子科大计算

13、机学院,int sendto(int sockfd, const void * data, int data_len, unsigned int flags, struct sockaddr *remaddr,sock_len remaddr_len),功能: 从TCP接收数据,返回实际接收的数据长度,出错时返回1。 服务器使用其接收客户请求,客户使用它接受服务器的应答。如果没有数据,将阻塞。 如果TCP收到的数据大于(/小于)缓存的大小,只抽出能够填满缓存的足够数据(/抽出所有数据并返回它实际接收的字节数)。 也可以使用recv接收面向连接的UDP的报文,若缓存不能装下整个报文,填满缓存后剩

14、下的数据将被丢弃。 参数说明: Sockfd:套接字描述符 Buf:指向内存块的指针 Buf_len:内存块大小,以字节为单位 flags:一般为0(MSG_WAITALL接收到指定长度数据时才返回) 举例:recv(sockfd,buf,8192,0),计算机网络编程,电子科大计算机学院,int recv(int sockfd, void *buf, int buf_len,unsigned int flags);,功能:从UDP接收数据,返回实际接收的字节数,失败时返回1 参数说明: Sockfd:套接字描述符 buf:指向内存块的指针 buf_len:内存块大小,以字节为单位 flags

15、:一般为0 from:远端的地址,IP地址和端口号 fromlen:远端地址长度 举例:recvfrom(sockfd,buf,8192,0, ,(struct sockaddr *),计算机网络编程,电子科大计算机学院,int recvfrom(int sockfd, void *buf, int buf_len,unsigned int flags,struct sockaddr *from,sock_len *fromlen);,功能: 撤销套接字. 如果只有一个进程使用,立即终止连接并撤销该套接字,如果多个进程共享该套接字,将引用数减一,如果引用数降到零,则关闭连接并撤销套接字。 参数

16、说明: Sockfd:套接字描述符 举例:close(socket_descriptor),计算机网络编程,电子科大计算机学院,close(int sockfd);,read和write 在UNIX和Linux中,可以代替recv和send,因为都调用内核的sosend实现。 小结:,计算机网络编程,电子科大计算机学院,套接字API中的主要系统调用,socket* connect* send(write)* recv(read)* close* bind *,listen * accept * recvfrom* sendto*,recvmsg sendmsg shutdown getpeername getsockopt setsockopt,不同的结构的机器阅读数据时使用不同的顺序 16 bit integer:,计算机网络编程,电子科大计算机学院,字节顺序转换,Low Byte,High Byte,High Byte,Low Byte,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号