Socket 通信 一、知识点回顾 1、Socket 的概念: Socket 的英文原意是“插座”。抽象出来,socket 实质上提供了进程通信的端点,进程通信前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。一个完整的socket 接口用一个相关描述就是:{ 协议,本地地址,本地端口,远地地址,远地端口}(这也就是网间网通信进程需要的五元组标示)。 2、客户/服务器模式: 在 TCP/IP 网络应用中,通信的两个进程间相互作用的主要模式是客户/服务器,即客户向服务器发出服务请求,服务器接收到请求后,提供相应服务。客户/服务器模式的建立基于以下两点:首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立关系,为二者的数据交换提供同步,这就是基于客户/服务器模式的TCP/IP。 二、程序模块及函数介绍 1、面向连接的套接字系统时序图 2、各函数介绍 (1)加载socket 库──WSAStartup() 每个 Winsock 应用程序必须加载相应版本的 Winsock DLL。如果在调用Winsock 函数前没有加载Winsock 库,函数返回 SOCKECT_ERROR, 出错代码将是 WSANOTINITIALISED 。 原型:int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData) 例如: int err; WSADATA wsaData; wVersionRequested=MAKEWORD(2,1); //使用 2.1 版本的 socket err=WSAStartup(w VersionRequested,&w saData); 返回值:函数调用成功返回 0。 (2)释放 Winsock 库──WSACleanup() 每个对 WSAStartup 的调用必须对应一个 WSACleanup 的调用,这个函数释放 Winsock 库。 原型:WSACleanup(void); (3)创建套接字──socket() 使用套接字前,必须调用 socket 函数创建一个套接字对象。 原型:SOCKET socket(int af,int type,int protocol); af:用来指定套接字使用的地址格式,WinSock 中只支持 AF_INET。 Type:用来指定套接字的类型,可以为 SOCK_STREAM 和 SOCK_DGRAM Protol:配合 type 参数的使用,用来指定使用的协议类型,可以是 IPPROTO_TCP,如果指定了是 TCP 和 UDP,此时可设置它为 0。 例如:socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 返...