【vc++精品源码栏目提醒】:以下是网学会员为您推荐的vc++精品源码-孙鑫VC视频教程笔记之第十四课“基于TCP和UDP的Socket编程” - 其它资料,希望本篇文章对您学习有所帮助。
在 OSI 的各层所使用的协议:1.应用层:telnetFTPHTTPDNSSMTPPOP32.传输层:TCPUDP TCP:面向连接的可靠的传输协议,通信前建立三次握手,握手成功后才能通信,对数据准确性要求较高的场合使用,如从网上载的安装文件,不能缺少任何信息 UDP:是无连接的,不可靠的传输协议,不需要建立连接,也没有重传和确认的机制,在实时性要求较高,但对数据准确度要求不是很高的场合使用,如视频会议,在线观看电影,当中丢失个别数据包并不影响整体的效果。
3.网络层:IP因为 OSI 七层结构较为复杂, 现在 TCP/IP 已经成为 Internet 所以使用较多的是 TCP/IP 模型,上通用的工业标准TCP/IP 模型包括 4 个层次:应用层,传输层,网络层,网络接口端口:1. ,TCP/IP 协议提出了协议端口的 为了标识通信实体中进行通信的进程(应用程序)概念2. 端口是一种抽象的软件结构 。
(包括一些数据结构和 I/O 缓冲区) 应用程序通过系统调用和某端口建立连接(binding)后,传输层传给该端口的数据都被相应的进程所接收,相应进程发给传输层的数据都通过该端口输出3. 端口用一个整数型标识符来表示,即端口号。
端口号跟协议相关,TCP/IP 传输层的两个协议 TCP 和 UDP 是完全独立的的两个软件模块,因此各自的端口号也相互独立4. 端口使用一个 16 位的数字来表示,它的范围是 065535,1024 以下的端口号保留给预定义的服务,例如,http 使用 80 端口套接字(Socket)1. Socket 的出现,使得程序员可以很方便的访问 TCP/IP,从而开发各种网络应用的程序2. 套接字存在于通信区域中,通信区域也叫地址族,他是一个抽象的概念,主要用于通过套接字通信的进程的共有特性综合在一起。
套接字通常只与同一个区域的套接字交换数据。
套接字的类型1. 流式套接字(SOCK_STREAM)提供面向连接的, 可靠的数据传输服务,数据无差错,无重复的发送,且按发送的顺序接收,基于 TCP 协议2. 数据保式套接字SOCK_DGRAM提供无连接的服务,数据包以独立包形式发送,不提供无错误的保证,数据可能丢失或重复,且接收顺序混乱,基于 UDP 协议基于 TCP(面向连接)的 Socket 编程服务器端顺序:1. 加载套接字库2. 创建套接字(socket)3. 将套接字绑定到一个本地地址和端口上(bind)4. 将套接字设为监听模式,准备接收客户请求(listen)5. 等待客户请求的到来;当请求带来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)6. 用返回的套接字和客户端进行通信(send/recv)7. 返回,等待另一个客户请求8. 关闭套接字closesocket客户端程序:1. 加载套接字库2. 创建套接字socket3. 向服务器发送连接请求(connect)4. 和服务器端进行通信send/receive5. 关闭套接字closesocket基于 UDP(面向无连接)的 socket 编程服务器端(接收端)程序:1. 加载套接字库2. 创建套接字(socket)3. 将套接字绑定到一个本地地址和端口上(bind)4. 等待接收数据(recvfrom)5. 关闭套接字closesocket客户端(发送端)程序1. 加载套接字库2. 创建套接字(socket)3. 向服务器发送数据(sendto)4. 关闭套接字closesocket创建基于 TCP 协议的 CS 程序的 Server 端所涉及的相关函数说明(按使用的先后顺序排列):1. int WSAStartup(WORD wVersionRequestedLPWSADATA lpWSAData):作用是加载套接字库和进行套接字库的版本协商a. 参数 wVersionRequested:用于指定准备加载的 Winsock 库的版本,高位字节指定所需要的 Winsock 库的副版本,低位字节则是主版本,可用 MAKEWORDXY其中,x 为高位字节,y为低位字节方便获得 wVersionRequested 的正确值。
指b. 参数 lpWSAData: 向 WSADATA 结构的指针,WSAStartup 用其加载的库版本有关的信息填在这个结构中2. SOCKET socketint afint typeint protocol:a. 参数 af 指定地址族,对于 TCP/IP 协议的套接字,它只能是 AF_INET也可写成PF_INET。
b. 对于 1.1 版本的 Socket, 参数 type 指定 Socket 类型, 它只支持两种类型的套接字,SOCK_STREAM 指定产生流式套接字,SOCK_DGRAM 产生数据报套接字。
c. 参数 protocol 与特定的地址家族相关的协议,如果指定为 0,那么他就会根据地址格式和套接字类别,自动为你选择一个合适的协议。
这是推荐使用的一种选择协议的方式。
3. int bindSOCKET sconst struct sockaddr FAR nameint namelen :a. 第一个参数指定要绑定的套接字,第二个参数指定该套接字的本地地址信息,是指向 sockaddr 结构的指针变量,由于该地址结构是为了所有的地址家族准备使用的,这个结构可能(通常会)随使用的网络协议不同而不同,所以,要用第三个参数指定该地址结构的长度。
sockaddr 机构定义如下:struct sockaddr u_short sa_family char sa_data14b. 上述结构第一个字段指定该地址家族,在这里必须设为 AF_INET。
sa_data 仅仅是表示要求一块内存分配区,起到占位的作用,该区域中指定与协议相关的具体地址信息。
由于 所以对于不同的协议家族,实际要求的只是内存区, 在 用不同的结构来替换 sockaddr。
TCP/IP中,我们可以用 SOCKADDR_IN 结构来代替 sockaddr,以方便我们填写地址信息。
c. struct SOCKADDR_IN short sin_family unsigned short sin_port struct in_addr sin_addr char sin_zero8sin_family 表示地址族,对于 IP 地址,sin_family 成员将一直是 AF_INET;成员 sin_port指定的将要分配给套接字的端口;成员 sin_addr 给出的是套接字的主机 IP 地址;sin_zero只是一个填充数,以使 sockaddr_in 结构和 sockaddr 结构的长度一样,一般不用设置。
除了 sin_family 外,SOCKADDR_IN 其他成员是按网络字节顺序表示的。
所以需要进行转换:htonlINADDR_ANY,htons6000,其中 6000 是端口号。
另外结构体的名称大写和小写指的是同一个。
将 IP 地址指定为 INADDR_ANY,允许套接字向任何分配给本机器的 IP 地址发送或接收数据。
一般一台机器一个网卡,但对于多网卡的机器,INADDR_ANY 将简化应用程序的编写。
将地址指定为 INADDR_ANY,允许一个独立的应用接受发自多个接口的回应。
如果我们只想让套接字使用多个 IP 中的一个地址,必须指定实际地址,要做到这一点,可以用 inet_addr函数, ,返回一个适合分配给 S_addr 的 u_long 类这个函数需要一个 IP 地址(如 192.168.80.88)型的数值。
Inet_ntoa函数完成相反的转换,它接受一个 in_addr 结构体类型的参数并返回一个以点分十进制的 IP 地址字符串。
htonl 把一个 u_long 类型从主机字节序转换为网络字节序。
htons 把一个 u_short 类型从主机字节序转换为网络字节序。
4. int listenSOCKET s int backlog:将套接字设置为监听模式,其中第二个参数设置等待请求连接的最大的值,即如果设置为 n,则前 n 个请求会放置在系统的请求连接队列中,应用程序会依次对这些请求进行服务,但第 n1 个连接请求则会被拒绝。
5. SOCKET acceptSOCKET s const struct sockaddr FAR addr int FAR addrlen:从客户端接收请求, 并创建连接,如果连接成功,则会返回一个当前成功建立连接的套接字,该套接字不是上面创建的监听套接字,而是仅仅适用于当前的一个请求连接,如果建立连接失败,则返回值是 INVALID_SOCKET,
上一篇:
[VC]深入分析MFC中的CArray类
下一篇:
计算机网络系统的安全集成