【vc++精品源码栏目提醒】:网学会员为需要vc++精品源码的朋友们搜集整理了一个socket通信的讲解 - 计算机等级相关资料,希望对各位网友有所帮助!
一个 socket 通信的讲解先介绍几个基本概念,同步Sync/异步Async,阻塞Block/非阻塞Unblock。
同步方式指的是发送方不等接收方响应,便接着发下个数据包的通信方式;而异步指发送方发出数据后,等收到接收方发回的响应,才发下一个数据包的通信方式。
阻塞套接字是指执行此套接字的网络调用时,直到成功才返回,否则一直阻塞在此网络调用上,比如调用 recv函数读取网络缓冲区中的数据,如果没有数据到达,将一直挂在 recv这个函数调用上,直到读到一些数据,此函数调用才返回;而非阻塞套接字是指执行此套接字的网络调用时,不管是否执行成功,都立即返回。
比如调用 recv函数读取网络缓冲区中数据,不管是否读到数据都立即返回,而不会一直挂在此函数调用上。
在实际 Windows 网络通信软件开发中,异步非阻塞套接字是用的最多的。
平常所说的 C/S(客户端/服务器)结构的软件就是异步非阻塞模式的。
创建 TCP 通信的过程及相关函数服务器端 。
一、创建服务器套接字(socket) 二、服务器套接字进行信息绑定(bind),并开始监听连接(listen)。
三、接受来自用户端的连接请求(accept)。
四、开始数据传输send/recv。
五、关闭套接字(closesocket)。
客户端 一、创建用户套接字(socket)。
二、与远程服务器进行连接(connect),如被接受则创建接收进程。
三、开始数据传输send/receive。
四、关闭套接字(closesocket)。
微软为 VC 定义了 Winsock 类如 CAsyncSocket 类和派生于 CAsyncSocket 的 CSocket 类,它们简单易用,可以使用这些类来实现自己的网络程序,但是为了更好的了解 Winsock API 编程技术,我们这里探讨怎样使用底层的 API 函数实现简单的 Winsock 网络应用程序设计,分别说明如何在 Server 端和 Client端操作 Socket,实现基于 TCP/IP 的数据传送,最后给出部分源代码。
在 VC 中进行 WINSOCK 的 API 编程开发的时候,需要在项目中使用下面三个文件,否则会出现编译错误。
1.WINSOCK.H: 这是 WINSOCK API 的头文件,需要包含在项目中。
可在 stdafx.h 中加入includewinsock2.h。
2.WSOCK32.LIB: WINSOCK API 连接库文件。
在使用中,一定要把它作为项目的非缺省的连接库包含到项目文件中去。
打开选择菜单 Project-Setting ALTF7,进入 Project Setting 对话框,在 Link 下的Object/library modules 输入 ws2_32.lib,然后点 OK,或者在头文件中添加:pragma commentlibws2_32.lib。
3.WINSOCK.DLL: WINSOCK 的动态连接库,位于 WINDOWS 的安装目录下。
一、服务器端操作 socket(套接字) 1在初始化阶段调用 WSAStartup 此函数在应用程序中初始化 Windows Sockets DLL ,只有此函数调用成功后,应用程序才可以再调用其他 Windows Sockets DLL 中的 API 函数。
在程式中调用该函数的形式如下:WSAStartup0x0202,(LPWSADATA)WSAData,其中 0x0202 表示我们用的是 WinSocket2.0 版本,WSAData 用来存储系统传回的关于 WinSocket 的资料。
2建立 Socket 初始化 WinSock 的动态连接库后,需要在服务器端建立一个监听的 Socket,为此可以调用 Socket函数用来建立这个监听的 Socket,并定义此 Socket 所使用的通信协议。
此函数调用成功返回 Socket 对象,失败则返回 INVALID_SOCKET调用 WSAGetLastError可得知原因,所有 WinSocket 的函数都可以使用这个函数来获取失败的原因。
SOCKET PASCAL FAR socket int af int type int protocol 参数: af:目前只提供 PF_INETAF_INET;type:Socket 的类型 SOCK_STREAM、SOCK_DGRAM;protocol:通讯协定如果使用者不指定则设为 0;如果要建立的是遵从 TCP/IP 协议的 socket,第二个参数 type 应为 SOCK_STREAM,如为 UDP(数据报)的 socket,应为 SOCK_DGRAM。
3绑定端口 接下来要为服务器端定义的这个监听的 Socket 指定一个地址及端口(Port),这样客户端才知道待会要 连 接 哪 一个地 址 的哪 个端口 , 为此 我们 要 调