第二章
来源:互联网 发布:淘宝生意怎么做 编辑:程序博客网 时间: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,函数就根据给定提供程序创建一个套接字。