目录
1 Socket编程-应用编程接口(API)
1.1 网络程序设计接口
1.2 应用编程接口API(Application Programming Interface)
1.3 几种典型的应用编程接口
1.4 Socket API
1.5 Socket 抽象---类似于文件的抽象
当应用进程创建套接字时,操作系统分配一个数据结构存储该套接字相关信息;
地址结构:已定义结构sockaddr_in
使用TCP/IP协议簇的网络应用程序声明端点地址变量时,使用结构sockaddr_in
1.6 Scoket编程-Socket API函数
(1)WSAStartup---使用Socket应用程序在使用Socket之前必须首先调用
(2)WSACleanup---在完成对请求的Socket库的使用后,最后要调用WSAClenup函数
(3)socket---创建套接字socket
(4)Closesocket---关闭一个描述符为sd的套接字socket
(5)bind ---绑定套接字的本地端点地址(IP地址+端口号)
(6)listen---设置服务器端的流套接字处于监听状态---只用于服务端
(7)connect---只用于客户端
(8)accept ---创建新的套接字socket,以提供并发服务
(9)send、sendto---发送数据
(10)recv、recvfrom---接收数据
(11)setsockpt、getsockopt---套接字参数的设置及读取
总结:Scoket API函数小结
1.7 Socket面向TCP/IP的服务类型
(1)TCP:可靠、面向连接、字节流传输、点对点;
(2)UDP:不可靠、无连接、数据报传输;
1.8 网络字节顺序
(1)TCP/IP定义了标准的用于协议头中的二进制整数表示:网络字节顺序(network byte order)
(2)某些Socket API函数的参数需要存储为网络字节顺序(如IP地址、端口号等)
(3)可以实现本地字节顺序与网络字节顺序间转换的函数
1.9 网络应用的Socket API(TCP)调用基本流程
2 Socket编程-客户端/服务端软件设计
2.1 解析服务器IP地址
(1)客户端可能使用域名(如study.163.com)或IP地址(如:123.58.180.21)标识服务器;
(2)IP协议需要使用32位二进制IP地址;
(3)需要将域名或点分十进制IP地址转换为32位IP地址;
2.2 解析服务器(熟知)端口号
(1)客户端还可能使用服务名(如HTTP)标识服务器端口;
(2)需要将服务名转换为熟知端口号;函数getservbyname();返回一个指向结构servent的指针
2.3 解析协议号
(1)客户端可能使用协议名(如:TCP)制定协议;
(2)需要将协议名转换为协议号(如:6);函数getprotobyname()实现协议名到协议号的转换;
返回一个指向结构protoent的指针;
2.4 TCP客户端软件流程
2.5 UDP客户端软件流程
2.6 Socket编程-服务器软件设计
2.6.1 四种类型基本服务器
(1)循环无连接(Iterative connectionless)服务器;
(2)循环面向连接(Iterative connection-oriented)服务器;
(3)并发无连接(Concurrent connectionless)服务器;
(4)并发面向连接(Concurrent connection-oriented)服务器;
2.6.2 循环无连接服务器基本流程
(1)创建套接字;
(2)绑定端点地址(INADDR_ANY+端口号);
(3)反复接收来自客户端的请求;
(4)遵循应用层协议,构造响应报文,发送给客户;
1、数据发送:
(1)服务端不能使用connect()函数;(2)无连接服务器使用sedto()函数发送数据报;
socket:服务器(UDP)套接字;data:(指针-存储待发送数据缓存的地址);length:(缓存中数据字节数);flags:(调试或控制选项,一般置零);destaddr:(指向结构sockaddr_in)的指针(客户端端点地址);addrlen:地址结构长度;
2、获取客户端点地址
调用recvfrom()函数接收数据时,自动提取;
socket:(UDP)服务器套接字;buf:存放数据报的缓存地址;length:缓存可用空间;flags:调试或控制选项;from:存放源地址的缓存地址,客户端的端点地址;fromlen:源地址长度;
2.6.3 循环面向连接服务器基本流程
(1)创建(主)套接字,并绑定熟知端口号;
(2)设置(主)套接字为被动监听模式,准备用于服务器;
(3)调用accept()函数接收下一个连接请求(通过主套接字),创建新套接字与该客户建立连接;
(4)遵循应用协议,反复接收客户端请求,构造并发送响应(通过新套接字);
(5)完成为特定客户服务后,关闭与该客户之间的连接,返回步骤3;
2.6.4 并发无连接服务器基本流程
主线程1:创建套接字,并绑定熟知端口号;
主线程2:反复调用recvfrom()函数,接收下一个客户请求,并创建心线程处理该客户响应;
子线程1:接受一个特定请求;
子线程2:依据应用层协议构造响应报文,并调用sedto()发送;
子线程3:退出(一个子线程处理一个请求后即终止);
2.6.5 并发面向连接服务器基本流程
主线程1:创建(主)套接字,并绑定熟知端口号;
主线程2:设置(主)套接字为被动监听模式,准备用于服务器;
主线程3:反复调用accept()函数接收下一个连接请求(通过主套接字),并创建一个新的子线程处理该客户响应;
子线程1:接收一个客户的服务请求(通过新创建的套接字);
子线程2:遵循应用层协议与特定客户进行交互;
子线程3:关闭/释放连接并退出(线程终止);