为了可以方便地开发网络程序,Berkeley在UNIX上推出了一种应用程序访问通信协议的操作系统调用的套接字(socket),这样程序员就可以方便地访问TCP/IP。
为了在Windows操作系统上使用套接字,微软和第三方厂商共同制定了一套标准即Windows Socket,简称WinSock。
所谓套接字,实际上是指向传输提供者的句柄。套接字可以分为3种,原始套接字,流式套接字和数据包套接字。
原始套接字
原始套接字是在WinSock2规范中提出的,它能够使程序开发人员对底层的网络传输机制进行控制,在原始套接字下接收的数据中包含IP头。
流式套接字
流式套接字提供了双向,有序,可靠的数据传输服务,该类型套接字在通信前,需要双方建立连接。(TCP协议就是流式套接字)
数据包套接字
UDP协议提供的是数据包套接字,支持数据的双向传输,但是不能保证数据传输的可靠性,有序性和无重复性。
基于TCP面向连接的socket编程的服务器端口流程如下:
1.创建套接字socket。
2.将创建的套接字bind到本地地址和端口上。
3.设置套接字的状态为监听状态(listen),准备接受客户端的连接请求。
4.接受请求(accept),同时返回得到一个用于连接的新套接字。
5.使用这个新套接字进行通信(通信函数使用send/recv)。
6.通信完毕,释放套接字资源。
基于TCP面向连接的socket编程的客户端流程如下:
1.创建套接字socket。
2.想服务器发出连接请求(connect).
3.请求连接后与服务器进行通信操作(send/recv)。
4.释放套接字资源(closesocket)。
在服务器一端,当调用套接字accept函数时,程序就会进行等待,直到客户端调用connect函数发送连接请求,然后服务器接受该请求,这样服务器与客户端就建立了连接,当连接建立完成后就可以进行通信了。
备注:对于客户端来说,当发起连接请求被接受以后,在服务器端就保存额该客户端的IP地址和端口号的信息,可以利用返回的套接字进行与客户端的通信。
UDP套接字的socket编程
采用UDP进行通信时,不需要建立连接,可以直接向一个IP地址发送数据但是不能保证对方能收到。
UDP面向无连接的socket编程的发送端程序流程如下:
1.创建套接字socket。
2.将套接字bind到一个本地地址和端口上。
3.等待接收数据(recvfrom)
4.释放套接字资源(closesocket)
UDP面向无连接的socket编程的接收端程序如下:
1.创建套接字socket。
2.面向服务器发送数据(sendto)。
3.释放套接字资源(closesocket)。