请教各位 winsock 的重叠模型

mul 2002-07-11 02:45:20
这种方式不知如何使用,有什么好处(和其他I\O模型相比)???
请各位不吝赐教,谢谢
...全文
8 点赞 收藏 4
写回复
4 条回复
mul 2002年07月11日
WSAAsyncSelect我不大喜欢使用,因为它有可能阻塞住窗口消息。
我一般使用WSAEventSelect,在线程中响应事件。
xuying() :
就是说单个socket使用overlapped并没有多大好处?不知有没有使用overlapped的发送接收的简单代码?
这是我写的一段代码:

//返回值为读取字节数
int CUdp::ReadUdp(LPSTR lpData, int nSize, CString& strFromAddr, u_short iFromPort)
{
//转换地址
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
int len = sizeof(addr);
int ret = WSAStringToAddress((LPSTR)((LPCTSTR)strFromAddr),AF_INET,NULL,
(LPSOCKADDR)&addr,&len);
if (ret != 0)
{
TraceLastErr("WSAStringToAddress");
return -1;
}
addr.sin_port = htons(iFromPort);
//读取
WSABUF wsabuf;
wsabuf.buf = lpData;
wsabuf.len = nSize;
unsigned long nLenofRev = -1;
DWORD dwFlag = 0;
ret = WSARecvFrom(
m_socket, //s
&wsabuf, //WSABUF
1, //buffer num
&nLenofRev, //point to rev num
&dwFlag, //point to flag
(LPSOCKADDR)&addr, //read from
&len, //addr len
&m_osRead, //overlapped read
NULL //Pointer to the completion routine
);
if (ret == SOCKET_ERROR)
{
if (WSAEWOULDBLOCK == WSAGetLastError())
{
unsigned long lTrans = 0;
while (WSAGetOverlappedResult(m_socket, &m_osRead, <rans, FALSE, FALSE)
== FALSE)
{
nLenofRev += lTrans;
if (WSA_IO_PENDING == WSAGetLastError())
{
TRACE0("IO pending (receive)\n");
continue;
}
else
{
TraceLastErr("receive");
closesocket(m_socket);
return -1;
}
}
}
else
{
TraceLastErr("Receive");
closesocket(m_socket);
return -1;
}
}
return nLenofRev;
}

使用起来性能好像也没什么提高?
不知 m_osRead的创建有什么要求没有(MSDN好像没说)?
请各位多多指教



回复 点赞
xuying 2002年07月11日
摘自<windows网络编程技术>第8章"

在Wi n s o c k中,相比其他I / O模型(select, WSAAsynSelect WSAEventSelect),重叠I / O(Overlapped I/O)
模型使应用程序能达到更佳的系统性能。重叠模型的基本设计原理便是让应用程序使用一个
重叠的数据结构,一次投递一个或多个Winsock I/O请求。针对那些提交的请求,在它们完成
之后,应用程序可为它们提供服务。该模型适用于除Windows CE之外的各种Wi n d o w s平台。
模型的总体设计以Wi n 3 2重叠I / O机制为基础。那个机制可通过R e a d F i l e和Wr i t e F i l e两个函数,
针对设备执行I / O操作。
最开始的时候,Wi n s o c k重叠I / O模型只能应用于Windows NT操作系统上运行的Wi n s o c k
1 . 1应用程序。作为应用程序,它可针对一个套接字句柄,调用R e a d F i l e以及Wr i t e F i l e,同时
指定一个重叠式结构(稍后详述),从而利用这个模型。自Winsock 2发布开始,重叠I / O便已
集成到新的Wi n s o c k函数中,比如W S A S e n d和W S A R e c v。这样一来,重叠I / O模型便能适用于
安装了Winsock 2的所有Wi n d o w s平台。
注意在Winsock 2发布之后,重叠I/O仍可在Windows NT和Windows 2000这两个操作系
统中,随R e a d F i l e和Wr i t e F i l e两个函数使用。但是,Windows 95和Windows 98均不具备
这一功能。考虑到应用程序的跨平台兼容问题,同时考虑到性能方面的因素,应尽量
避免使用Wi n 3 2的R e a d F i l e和Wr i t e F i l e函数,分别换以W S A R e c v和W S A S e n d函数。

1. 客户机的开发
若打算开发一个客户机应用,令其同时管理一个或多个套接字,那么建议采用重叠I / O或
W S A E v e n t S e l e c t模型,以便在一定程度上提升性能。然而,假如开发的是一个以Wi n d o w s为
基础的应用程序,要进行窗口消息的管理,那么W S A A s y n c S e l e c t模型恐怕是一种最好的选择,
因为W S A A s y n c S e l e c t本身便是从Wi n d o w s消息模型借鉴来的。若采用这种模型,我们的程序
一开始便具备了处理消息的能力。
2. 服务器的开发
若开发的是一个服务器应用,要在一个给定的时间,同时控制几个套接字,建议大家采
用重叠I / O模型,这同样是从性能出发点考虑的。但是,如果预计到自己的服务器在任何给定
的时间,都会为大量I / O请求提供服务,便应考虑使用I / O完成端口模型,从而获得更好的性
能。
回复 点赞
xuying 2002年07月11日
摘自<windows网络编程技术>第8章"

在Wi n s o c k中,相比其他I / O模型(select, WSAAsynSelect WSAEventSelect),重叠I / O(Overlapped I/O)
模型使应用程序能达到更佳的系统性能。重叠模型的基本设计原理便是让应用程序使用一个
重叠的数据结构,一次投递一个或多个Winsock I/O请求。针对那些提交的请求,在它们完成
之后,应用程序可为它们提供服务。该模型适用于除Windows CE之外的各种Wi n d o w s平台。
模型的总体设计以Wi n 3 2重叠I / O机制为基础。那个机制可通过R e a d F i l e和Wr i t e F i l e两个函数,
针对设备执行I / O操作。
最开始的时候,Wi n s o c k重叠I / O模型只能应用于Windows NT操作系统上运行的Wi n s o c k
1 . 1应用程序。作为应用程序,它可针对一个套接字句柄,调用R e a d F i l e以及Wr i t e F i l e,同时
指定一个重叠式结构(稍后详述),从而利用这个模型。自Winsock 2发布开始,重叠I / O便已
集成到新的Wi n s o c k函数中,比如W S A S e n d和W S A R e c v。这样一来,重叠I / O模型便能适用于
安装了Winsock 2的所有Wi n d o w s平台。
注意在Winsock 2发布之后,重叠I/O仍可在Windows NT和Windows 2000这两个操作系
统中,随R e a d F i l e和Wr i t e F i l e两个函数使用。但是,Windows 95和Windows 98均不具备
这一功能。考虑到应用程序的跨平台兼容问题,同时考虑到性能方面的因素,应尽量
避免使用Wi n 3 2的R e a d F i l e和Wr i t e F i l e函数,分别换以W S A R e c v和W S A S e n d函数。

1. 客户机的开发
若打算开发一个客户机应用,令其同时管理一个或多个套接字,那么建议采用重叠I / O或
W S A E v e n t S e l e c t模型,以便在一定程度上提升性能。然而,假如开发的是一个以Wi n d o w s为
基础的应用程序,要进行窗口消息的管理,那么W S A A s y n c S e l e c t模型恐怕是一种最好的选择,
因为W S A A s y n c S e l e c t本身便是从Wi n d o w s消息模型借鉴来的。若采用这种模型,我们的程序
一开始便具备了处理消息的能力。
2. 服务器的开发
若开发的是一个服务器应用,要在一个给定的时间,同时控制几个套接字,建议大家采
用重叠I / O模型,这同样是从性能出发点考虑的。但是,如果预计到自己的服务器在任何给定
的时间,都会为大量I / O请求提供服务,便应考虑使用I / O完成端口模型,从而获得更好的性
能。
回复 点赞
xuying 2002年07月11日
摘自<windows网络编程技术>第8章"

在Wi n s o c k中,相比其他I / O模型(select, WSAAsynSelect WSAEventSelect),重叠I / O(Overlapped I/O)
模型使应用程序能达到更佳的系统性能。重叠模型的基本设计原理便是让应用程序使用一个
重叠的数据结构,一次投递一个或多个Winsock I/O请求。针对那些提交的请求,在它们完成
之后,应用程序可为它们提供服务。该模型适用于除Windows CE之外的各种Wi n d o w s平台。
模型的总体设计以Wi n 3 2重叠I / O机制为基础。那个机制可通过R e a d F i l e和Wr i t e F i l e两个函数,
针对设备执行I / O操作。
最开始的时候,Wi n s o c k重叠I / O模型只能应用于Windows NT操作系统上运行的Wi n s o c k
1 . 1应用程序。作为应用程序,它可针对一个套接字句柄,调用R e a d F i l e以及Wr i t e F i l e,同时
指定一个重叠式结构(稍后详述),从而利用这个模型。自Winsock 2发布开始,重叠I / O便已
集成到新的Wi n s o c k函数中,比如W S A S e n d和W S A R e c v。这样一来,重叠I / O模型便能适用于
安装了Winsock 2的所有Wi n d o w s平台。
注意在Winsock 2发布之后,重叠I/O仍可在Windows NT和Windows 2000这两个操作系
统中,随R e a d F i l e和Wr i t e F i l e两个函数使用。但是,Windows 95和Windows 98均不具备
这一功能。考虑到应用程序的跨平台兼容问题,同时考虑到性能方面的因素,应尽量
避免使用Wi n 3 2的R e a d F i l e和Wr i t e F i l e函数,分别换以W S A R e c v和W S A S e n d函数。

1. 客户机的开发
若打算开发一个客户机应用,令其同时管理一个或多个套接字,那么建议采用重叠I / O或
W S A E v e n t S e l e c t模型,以便在一定程度上提升性能。然而,假如开发的是一个以Wi n d o w s为
基础的应用程序,要进行窗口消息的管理,那么W S A A s y n c S e l e c t模型恐怕是一种最好的选择,
因为W S A A s y n c S e l e c t本身便是从Wi n d o w s消息模型借鉴来的。若采用这种模型,我们的程序
一开始便具备了处理消息的能力。
2. 服务器的开发
若开发的是一个服务器应用,要在一个给定的时间,同时控制几个套接字,建议大家采
用重叠I / O模型,这同样是从性能出发点考虑的。但是,如果预计到自己的服务器在任何给定
的时间,都会为大量I / O请求提供服务,便应考虑使用I / O完成端口模型,从而获得更好的性
能。
回复 点赞
发动态
发帖子
通信技术
创建于2007-08-27

2781

社区成员

2.8w+

社区内容

通信技术相关讨论
社区公告
暂无公告