socket学期学习小结

来源:互联网 发布:windows系统修复 编辑:程序博客网 时间:2024/05/18 19:46
Socket套接字总结来说就是IP+端口号,对掌握套接字的基础知识必须了解IP地址分类,存储,以及端口号的分类和常用服务的端口号。
一、IP地址的分类:
    IP地址分为两种,ipv4/ipv6。长度32位,四个字节,每个字节之间用一个英文’ . ’隔开,根据开头为0,10,110,1110、11110分为五类,前三类广泛用于网络中,第四类,第五类是保留广播地址。剩下地址的头8*n-n为网络ID,其余为主机ID,其中n表示第几类,因为每类地址包含的主机数不同,我们处于亚洲的网络数以第三类为主,所以以第三类ip比较常见,而欧美等发达地区大公司居多,需要主机数比较多所以以第一类ip地址比较多,另外值得一提的是处在亚洲的国际DNS服务器仅有三台,这无疑又是给网络拥塞带来了很多的麻烦。这也是为什么中国的服务器响应时间慢的原因,ip地址繁多,查找速率下降带来套接字connect可能会超时的一个原因。
二、端口号:
    端口是TCP/IP协议簇中,应用层进程与传输层协议之间的通信端口,在OSI参考模型中称之为应用层进程与传输层协议实体之间的服务访问点。
     应用层通过系统调用与某个端口进行绑定,然后就可以发送数据,值得注意的是,端口号仅具有本地性质,不同的主机不同的进程分配到的端口号在网络中并不唯一,这就需要利用C/S架构的客户机服务器通信模式,这也是本文中重点讨论内容之一。
   服务器首先将自己的端口号设置好,这里的端口是监听端口。当收到客户端请求连接时就临时分配一个空闲端口用于实际连接通信用。总结来说端口是一种标识符,用来表示网络中两主机之间进程的符号。进而完善以ip为标识的网络通信,精确到具体进程,方便应用管理。


三、socket编程:
   目前来说通用的网络编程有三种:基于tcp/ip协议栈、基于www应用、基于.net的webservices。在交互模式上有C/S架构和P2P架构,本文讨论的是基于tcp/ip协议栈的C/S网络编程。Socket套接字最早是由加州大学贝克利分校开发的BSD Unix的一部分,因为只提供应用程序接口而具有通用性,被Windows和Linux沿用至今。Windows借以开发出适合于本系统的winsock开发库,目前已经开发到2.2版本。
常见的socket编程的框架如下
   服务器端先运行,先建立使用tcp/ip流式的还是数据报格式的socket套接字,然后绑定指定的监听对象,此对象中包含服务器的端口号、ip地址、监听套接字。开始监听。在接受到有客户端发来的请求后选择accept连接。对客户端而言,首先建立socket对象然后connect响应的服务器端口。若中间无差错就成功建立连接,此时可通过send和recv函数进行数据的收发,这就实现了基本的通信功能。因为需要对缓冲区进行大小设置,通过读缓冲区写缓冲区达到,其中可对读缓冲区的前几个字节进行分类,区分是图片文件,文本文件,音视频文件等。实现文件传送。
在传送完成时需要关闭套接字,与开始socket准备的startup函数对应要加上WSAclose函数。断开与服务器端的连接。
因为在两台机器之间只有客户机发起了connect,服务器accept函数才能响应,需要两个函数时刻保证运行,这在顺序式程序设计是不太现实的,没人知道客户端什么时候发送请求,因此需要引入多线程技术,独立运行两个函数,使之能匹配的上。这就是阻塞和非阻塞模式编程的区别。在实际开发中服务器是一个资源,有很多客户端要获取资源,就要建立多对一的连接,为了让服务器更快的响应请求,Windows提供了五种编程编程模型:即select模型、WSAAsyncSelect模型、WSAEventSelect模型、重叠io模型、完成端口模型。
(一、)Select模型:
   是服务器可同时对多个socket进行管理,函数原型:
int select( int nfds, fd_set FAR* readfds, fd_set * writefds, fd_set * exceptfds, const struct timeval * timeout);
nfds:是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1。
readfds:(可选)指针,指向一组等待可读性检查的套接口。
writefds:(可选)指针,指向一组等待可写性检查的套接口。
exceptfds:(可选)指针,指向一组等待错误检查的套接口。
timeout:select()最多等待时间,对阻塞操作则为NULL。
在winsock2.h中定义了4个宏分别是:FD_CLR(S,*SET)、FD_ISSET(S,*SET)、FD_SET(S,*SET)、FD_ZERO(S,*SET)用于操作fd_set,分别执行删除指定socket,检查是否为集合中成员,添加指定socket,初始化为空集合。相较于传统阻塞式通信,在监听完成后,将套接字设为非阻塞式模型并将其添加到一个集合中便于后续select判断。
(二、)WSAAsyncSelect模型:
    该模型使得socket接受以消息为基础的网络事件通知,实现读写异步通知,但不具备异步数据传输,核心函数是WSAAsyncselect(SOCKET s ,HWND hWnd,unsigned int wMsg,long lEvent)
s,需要通知的套接字。
hWnd 网络事件发生时用于接受消息的窗口句柄。
wMsg,网络事件发生时接受到的消息。
lEvent,感兴趣的网络事件。
其中使用该函数前函数必须注册、创建窗体并提供支持函数winProc.
(三、)WSAEventSelect模型:
   核心函数WSAEventSelect(SOCKET s,WSAECENT hEventObject,long  lNetworkEvents ),以事件为驱动的编程基本流程:
1、初始化环境,创建socket
2、创建时间对象
3、将新事件对象和舰艇的socket关联,并注册改socket关注的网络事件集合
4、等待所有事件上发生注册网络事件,并进行处理
5、若触发FD_ACCEPT则接受来自客户端的请求,得到与用户通信的socket,为改socket创建事件对象,注册该socket关注的事件集合,
6、若触发FD_CLOSE ,则关闭socket并释放资源
7、触发FD_RECV,调用recv()接收数据
8、触发FD_SEND调用send()发送数据
(三、)重叠IO模型:
   使用重叠结构提交多个I/O请求,并在数据传输结束后通知应用程序,其中WSAOVERLAPPED结构体是重叠的核心,WSASend和WSArecv都要绑定结构对象,结构体定义如下:
     Typedef struct _WSAOVERLAPPED
{
   DWORD Internal//由重叠IO实现内部使用的字段
   DWORD InternaslHigh//由重叠IO实现内部使用的字段
   DWORD Offset//NULL
   DWORD OffsetHigh//NULL
   WSAEVENT hEvent//重叠IO包含的一个有效对象句柄
}WSAOVERLAPPED,*LPWSAOVERLAPPED;
(四、)基于完成端口模型的socket编程:
   属于并行线程模型,解决了服务器创建线程数量的限制,加快了响应速度,节省了资源。使用线程池进行管理,创建完成端口对象后创建N个工作线程,该线程主要检测完成端口的状态,有客户端数据并将接受的数据发送到客户端,初始化环境后监听并接受客户端的请求,完成socket与完成端口对象的关联,以异步的方式在accept上接收数据。
总结:
分析了五种模型,从资源利用率,响应速度来看完成端口无疑是目前使用额最广范的模型,对企业级应用来说具有一定的优势,但是在个人角度来说应用的线程数有限,通常不需要成千上百的进程并发执行,在编写小程序时可以考虑前四种。至于阻塞式的程序我觉得主要是用于测试时使用,毕竟非阻塞额好处是显而易见的。
参考文献:
[1]、杨秋黎,金智 Windows网络编程

[3]、谢希仁       计算机网络

-------------------------------------------------------------------------------------------------------------------------------------------------

                                                                                                                                                                                                                                              by jear chen 

                                                                                                                                                                                                                                           转载注明出处

0 0