Windows Sockets 基础

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">Windows Sockets基础</span>
1.通信程序的简单理解 
 
图1 两个Windows sockets应用程序之间的交互
通信程序,说白了就是发送二进制数据0和1的组合,我们设计的程序只不过是根据接收或者发送的数据来调整程序的执行过程。


应用程序A与应用程序B进行通信:假设为最简单情况,应用程序A发送数据(假设API名称为send()),应用程序B接收数据(假设API名称为recv())。从用户进程的角度看,B调用recv()等待A发送数据,A调用send()发送数据,两个程序都只是调用Windows Sockets API完成通信,横向来看为两个应用层交流,但是从纵向来看,send()或者recv()肯定会调用通信协议的下层来支持我们的操作。在实际来看,肯定式物理介质连接。只不过我们只调用一个send()或者recv()看起来同一层的交互。
 
图2 通信协议数据的封装
在连接建立成功后,用户数据由用户自己输入,用户调用函数,直接传送到通信协议下一层,协议的上一层都作为下一层的数据部分,然后与头部共同组成本层的协议帧。
每一层的协议帧肯定会分不同类型。比如建立连接的过程,肯定是物理层先建立完毕,才能建立IP层的连接。在物理层连接过程中,肯定不会有上一层的数据,此时的数据部分应该是建立连接需要的一些命令选项,因此不会涉及到IP层,同样更不会涉及到TCP层、应用层。
2. 套接字
套接字就是为应用层与下一层提供一个接口。比如,要发送字符串“TCP”到服务端,只要调用Windows sockets中的api函数send()表明要发送“TCP”就可以,至于其他的连接等等都由下面几层进行操作。
对每一个具有连接操作的程序建立套接字,就是为了区分不同进程的TCP连接,简单来说就是为了区分,就相当于起个名作为标志而已。
套接字类型:
流套接字:双向有序、无重复并且没有记录边界的数据流服务。

数据报套接字:虽然支持双向的数据流,但不保证数据式可靠的、有序的和无重复的,即从数据报套接字接收数据有可能是重复的,或者和数据发出时的顺序不同。


typedef unsigned int u_int;
typedef u_int        SOCKET;
</pre><pre name="code" class="cpp" style="font-size: 18px;">#define INVALID_SOCKET<span>	</span>(SOCKET)(~0)

Windows Sockets中除了INVALID_SOCKET不是一个有效的套接字,在0到INVALID_SOCKET-1之间数值都是有效套接字。所以在调用socket()函数时,如果返回值为INVALID_SOCKET,表示创建套接字失败。


猜你喜欢

转载自blog.csdn.net/u012633319/article/details/50762083