这个写的好,看这个!
socket编程
应用编程接口API(Applicayion Programming Interface)
是一个应用进程的控制权和操作系统的控制权进行转换的一个系统调用接口。应用层与传输层需要一个接口,起到连接作用,连接应用进程和操作系统。
典型的API:
- UNIX的 socket interface
- windows 的WINSOCK
- UNIX 的TLI(Transport Layer Interface)
Socket API
对外(例如客户机向服务器发送客户机想要连接的端口)标识通信端点:
- IP地址+端口号
对内(例如客户机对自己的套接字的管理)操作系统进程管理套接字:
- 套接字描述符(一个进程创建一个套接字,的同时还会返回以一个套接字描述符)
Socket抽象:
- 类似于文件的管理(在UNIX中套接字和文件一样)
- 当应用进程创建套接字时,操作系统会分配一个数据结构存储套接字的相关信息
- 同时返回套接字描述符
通常(在TCP/IP中)把IP地址+ 端口号成为端点地址。当使用套接字进行通信的时候就需要指定套接字的本地地址和远程地址。
socket地址结构
已经定义的结构socketaddr_in:
地址族的定义使得不同协议都可以使用socket套接字进行通信,也进而导致了地址长度变量的出现,因为不同的协议地址长度一般不同。现在的TCP/IP的地址族都写AF_INET。
socket API 函数
Win socket的实现机制是:Windows操作系统的动态连接库方式。
1.WSAtratup
2.WSACleanup
3.socket
Socket 面向TCP/IP的服务类型:
4.Closesocket
5.bind
6.listen
7.connect
仅用于客户端,
8.accept
多线程进行,TCP是点对点的,如果没有accept创建的新的套接字的话,那么服务器端的应用进程就只能给一个客户端服务器。
网络字节顺序(协议头中的二进制整数都用它表示)
因此一些套接字的API函数需要存储为网络字节顺序
基本流程
客户端软件的设计
解析服务器的IP地址
解析服务器的端口号
解析协议号
TCP客户端历程(真正的与服务器建立连接)
- 确定服务器的IP地址和端口号
- 创建套接字
- 分配本地端点地址(IP + 端口号)
- 连接服务器
- 遵循应用层协议进行通信
- 关闭释放连接
UDP的客户历程(只是确定服务器的位置)
- 确定IP地址与端口号
- 创建客户端套接字
- 分配端点地址
- 指定服务器的端点地址,构造UDP数据报。
- 遵循应用层协议
- 释放套接字
服务器软件设计
1.循环无连接服务器
一次只处理一个客户,采用UDP。
基本流程:
- 创建套接字
- 绑定端点地址
- 反复接受来自客户的请求
- 遵循应用层协议,构造响应报文,发给客户端
数据的发送:
- 连接服务器connect( )
- 不连接服务器sendto()
获取客户端点地址:
- 用recvfrom( ) 接受数据,自动提取。
2.循环面向连接服务器
基本流程:
- 创建套接字
- 绑定端点地址
- 设置主套接字为被动监听模式,准备用于服务器
- 调用accept()函数接受下一个连接的请求(通主套接字),创建新套接字与客户建立连接。
- 遵循应用层协议,反复接受客户请求,构造并发送响应
- 完成客户的服务后,关闭之间的连接,返回第三步。
3.并发无连接服务器
并发无连接服务器流程:
- 创建套接字,绑定端口号
- 反复的调用recvfrom()函数,接受下一个客户的请求,并创建新新线程处理该用户的响应(一直进行)
- 子线程接受特定的请求
- 子线程依据应用程的协议构造响应报文,调用sendto()发送。
- 子线程完成服务后关闭。
4.并发面向连接服务器
基本流程:
- 创建套接字,绑定端口号
- 设置主套接字为被动监听模式,准备用于服务器
- 反复的调用accept()函数接受下一个连接请求,创建一个新的子线程处理该用户的响应
- 遵循应用层协议,反复接受客户请求,构造并发送响应
- 完成客户的服务后,关闭之间的连接