第二章

来源:互联网 发布:淘宝生意怎么做 编辑:程序博客网 时间:2024/04/29 19:23


设计Winsock

2.1 系统体系结构

         提供程序分为两种类型:基础提供程序和分层提供程序。基础提供程序位于传输协议顶端,如微软的TCP/IP和UDP/IP提供程序,或实现QOS提供程序。分层提供程序位于WS2_32.DLL之下,基础提供之上,能截获并操纵Winsock调用。

                                                                      Winsock系统体系结构

应用程序

WS2_32.DLL

分层/基础提供服务

RSVP

代理

默认微软提供(MSWSOCK.DLL/MSAFD.DLL)

                                                                              

Windows套接字内核模式驱动程序(AFD.SYS)

                                           

传输协议

TCP/IP

ATM

其他协议

 

2.2 协议特征

         2.2.1面向消息

                  对每个离散的写命令来说,如果某个传输协议只将那些字节当作一条独立的消息在网上传输,我们就说这种协议是面向消息的。

         2.2.2面向流

                  流服务的定义是连续的数据传说,不管消息边界是否纯在。

         2.2.3伪流

                  多数情况下把伪流视为一个普通的“面向流的协议”

         2.2.4  面向连接和无连接

                  面向连接的服务中,进行数据交换之前,同性双方必须建立一条路劲,而无连接协议不能保证接收端是否正在监听。

         2.2.5  可靠性和有序性

                  可靠性:保证发送端发出的额每个字节都能够到达接收端。

                  有序性:数据到达接收端的顺序进行处理。

                  可靠性和有序性不可兼得。

         2.2.6  正常关闭

         2.2.7  广播数据

                  从一个工作站发出数据,局域网内的其他所有工作站都能收到。适用于无连接协议。

         2.2.8  多播数据

                  多播指一个进程发送数据而一个或多个接收端可接受的数据的能力。视频会议引用常常使用多播。

         2.2.9服务质量

         QOS体现了应用程序请求独占网络带宽的能力。实时视频流较好的利用了QOS。        

         2.2.10  部分消息

                  面向消息的协议。

         2.2.11  路由选择的考虑

        

2.3 Winsock遍录

         Int   WSAEnumProtocols{

                  LPINT       lpiProtocols,

                  LPWSAPROTOCOL_INFO                 lpProtocolbuffer,

                  LPDWORD       lpdwBufferLength

}

函数使用

int main(void)

{

         WSADATA               wsaData;

         WSAStartup(MAKELANGID(2,2),&wsaData);

 

         LPWSAPROTOCOL_INFO info = NULL;

         DWORD  dwLen;

 

         if(SOCKET_ERROR == WSAEnumProtocols(NULL, 0, &dwLen))

         {

                  intiErrorCode = GetLastError();

                  if(WSAENOBUFS != iErrorCode)

                  {

                          WSACleanup();

                          return 0;

                  }

         }

 

         if(dwLen>0)

         {

                  info =(LPWSAPROTOCOL_INFO)GlobalAlloc(GPTR, dwLen);

                  if(info == NULL)

                  {

                          printf("allocate memory failed!");

                          GlobalFree(info);

                          WSACleanup();

                          return 0;

                  }

                  intiProtocolCounts = WSAEnumProtocols(NULL,info,&dwLen);

                  for(int i =0; i<iProtocolCounts;i++)

                  {

                          printf("\ni=%d\nProtocolDescription:%s\n", i,info[i].szProtocol); 

                  }

                  GlobalFree(info);

         }

 

         WSACleanup();

 

         system("pause");

         return0;

}

LPWSAPROTOCOL_INFO  结构体

         dwSeriveFlags1参数

2.3.1 Winsock编录和Win64

2.3.2 创建套接字

                  某些情况下,多个提供程序可共同一个地址族,套接字类型以及协议。PSVP提供提供程序就存在这情况。多个提供程序可以共享一个地址族,套接字类型以及协议,所以不可能用socketAPI从PSVP提供程序创建套接字,使用WSASocket函数

         SOCKET   WSASocket{

         Int    af,

         Int    type,

         Int protocol,

         LPWSAPROTOCOL_INFOA      lpProtocolInfo,

         GROUP    g,

         DWORD   dwFlags

}      

如果lpProtocolInfo引用一个提供程序条目,前面3个参数都是预先设定的FROM_PROTOCOL_INFO,函数就根据给定提供程序创建一个套接字。

原创粉丝点击