谁给我讲解一下网络编程的重叠I/O方式,有源码最好。(50分)

  • 主题发起人 主题发起人 DHWN
  • 开始时间 开始时间
D

DHWN

Unregistered / Unconfirmed
GUEST, unregistred user!
我对于重叠I/O和基于事件的异步选择模型的区别很不理解,比如:重叠I/O如何响应消息或事件(或者说如何替代消息/事件模式:数据到达,下载失败等,又如何用一个线程管理多个Socket,各个Socket又如何协调下载,而其中完成例程的回调函数更是一头雾水,请仔细讲解。如有详细代码更好。
 
你所说的模式《Windows网络编程》中都有详解和例子。完成例程的回调,刚开始的时候偶也很糊涂,呵呵,弄清楚原理后就明白了。我把《Windows网络编程》中C写的例子“翻译”成了Delphi,你要不要?
 
to ego 发一份给lotuscheng@163.com谢谢
 
dfw001,邮件已发,请验收。
 
to ego 发一份给qwerty200123@163.com,谢谢。
 
在《WINDOWS网络编程技术》一书中Socket是全局变量,完成例程中可以处理,但我听说重叠I/O中一个线程可以管理多个Socket,不知如何实现。另外,WSASend()中lpCompletion
Routine参数我都是见设为NULL,不知提供一个完成例程有什么好处和作用。
 
to ego 发一份给lovejingtao@21cn.com,谢谢。
 
to DHWN:
socket全局变量?偶的完成程序中Listen的socket是全局的,主要是为了方便使用(其实也可以不用全局变量)。WSASend最后一个参数不为空,那是完成例程模式呀。
重叠IO(也就是常说的完成端口)偶还有很多地方不太明白,压力测试始终通不过[:(!]

to jingtao:
呵呵,老兄在网络方面的造诣偶是望尘莫及,以后还请多指教。

上面二位,完成例程的例子已发,请验收。
 
我是说只有一个Socket,但如果我要写多点传送的程序,不是要多个Socket吗?而完成例程
的例子却只针对一个Socket。
 
来自:copy_paste, 时间:2003-3-14 18:42:00, ID:1682374
CSDN有几篇关于完成端口的翻译的文章,还可以,我就是下载其中的例子看的。

TCP网络程序设计-完成端口之应用 (bluecrest原作)
http://www.csdn.net/develop/Read_Article.asp?Id=16630

用完成端口开发大响应规模的Winsock应用程序(5/完... (chiway翻译)
http://www.csdn.net/develop/Read_Article.asp?Id=15228

用完成端口开发大响应规模的Winsock应用程序(4) (chiway翻译)
http://www.csdn.net/develop/Read_Article.asp?Id=15226

用完成端口开发大响应规模的Winsock应用程序(3) (chiway翻译)
http://www.csdn.net/develop/Read_Article.asp?Id=15225

用完成端口开发大响应规模的Winsock应用程序(2) (chiway翻译)
http://www.csdn.net/develop/Read_Article.asp?Id=15224

摘译:用完成端口开发大响应规模的Winsock应用程... (chiway翻译)
http://www.csdn.net/develop/Read_Article.asp?Id=15212

摘译:用完成端口开发大响应规模的Winsock应用程... (chiway翻译)
http://www.csdn.net/develop/Read_Article.asp?Id=15211

完成端口(上) (bnwxf翻译) Visual C++ 1443 2002-1-9
http://www.csdn.net/develop/Read_Article.asp?Id=11899

Windows Sockets 2.0:使用完成端口高性能,可扩展... (vcbear翻译)
http://www.csdn.net/develop/Read_Article.asp?Id=10177

来自:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1666178

偶也是刚刚接触IOCP,正在学习[:)]
 
楼上的历害
 
许多人说重叠I/O的优点就是一个线程可管理多个Socket,但却没有个例子。好象听说张无忌已经完成了一个,请帮我找找他。
 
ego:
我脸红加惭愧中......
没收到,烦请重发一次
lovejingtao@21cn.com
lovejingtao@163.net
我爱收集这类东西,嘿嘿
 
《WINDOWS网络编程技术》的完成例程只有一个,且只在一个Socket上继续投递另一个WSARecv。但如果在一个线程中有多个Socket,完成例程如何判断当前是哪一个Socket。
用Socket数组可以吗?比如完成例程(WorkerRoutine)中:
WSARecv(Socket,&DataBuf,1,&RecvBytes,&Flags,&Overlapped,WorkerRoutine);
 
呵!其实看看《WINDOWS网络编程技术》的完成例程就行了,
C和DELPHI的转换没那么麻烦。
 
to ego:
不知道能不能也给我发一份,这本书,我刚开始看,谢谢
jlutt@163.com
 
已想明白了,用WSAEventSelect模型可以实现一个线程管理64个套接字。现在问题是如何像
一些下载软件那样实现某个套接字连接错误时等待几秒后重试(一个线程里),用Sleep可
已吗,好象Sleep使整个线程暂停运行,这时其他套接字的事件如何处理,数据如何接收和
发送,会不会漏掉。
 
to ego:发一份给我好吗?xtjf@163.net
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部