能力值:
(RANK:1010 )
|
-
-
26 楼
最初由 ateddybear 发布 首先对楼主贡献的资料深感谢意.刚好要用到这方面的东西,真是雪中送碳. 但这里还有一些问题要请教楼主 1)在查找命名管道资料地过程中也看了<WINDOWS网络编程技术>这本书,其中讲到 实现对管道实例的处理有两种方法,一是通过多线程,每个线程处理一个实例, 二是通过IO重叠机制.但楼主的例子中两者都用到了.所以我想了解一下IO重叠机制的原理是什么?在什么情况下用得着? ........
IO重叠的目标是实现异步I/0
个人感觉在C/S中使用管道是个比较好的选择
每个客户端都使用一个特定的管道与服务器进行独立交互
与TCP有点相似的是,在进行数据传输之前,会建立连接
另外,客户端有处理的速度不通的问题,可以使用异步I/0,配合等待函数
一般使用的是一个管道对应一个线程,
如果客户端多的话,可以使用线程池,即多量的管道对应少量的线程
关于这方面知识,过两天(大概28号以后)我会详细介绍的,最近脱不开身
|
能力值:
( LV2,RANK:10 )
|
-
-
27 楼
to ateddybear:
我简单的看了下代码,北极星并没有实现重叠IO,虽然文章里面提到了重叠IO,但是他并没有实现。
他还是用每个客户端一个线程的方法来处理的。
要实现重叠IO的话,代码绝对不止这些,还要复杂N倍,你到网上搜一下IOCP,就会有N多例子代码。
ATL里面也有个简单的IOCP实现,可以看一下。
北极星:你在没有搞清楚一些问题之前,最好不要发表出来,会误导别人的。(或者我对重叠IO的理解,跟你的理解不一样)
|
能力值:
( LV13,RANK:970 )
|
-
-
28 楼
最初由 北极星2003 发布 IO重叠的目标是实现异步I/0 个人感觉在C/S中使用管道是个比较好的选择 每个客户端都使用一个特定的管道与服务器进行独立交互 与TCP有点相似的是,在进行数据传输之前,会建立连接 另外,客户端有处理的速度不通的问题,可以使用异步I/0,配合等待函数 ........ 同情以下
|
能力值:
( LV2,RANK:10 )
|
-
-
29 楼
北极星老大要写完成端口了啊
搬个凳子学习。
|
能力值:
(RANK:1010 )
|
-
-
30 楼
最初由 bates 发布 to ateddybear: 我简单的看了下代码,北极星并没有实现重叠IO,虽然文章里面提到了重叠IO,但是他并没有实现。 他还是用每个客户端一个线程的方法来处理的。 要实现重叠IO的话,代码绝对不止这些,还要复杂N倍,你到网上搜一下IOCP,就会有N多例子代码。 ATL里面也有个简单的IOCP实现,可以看一下。 ........ 重叠I/0需要使用OVERLAPPED结构,可以用于I0CP(I0完成端口)
完成端口用于异步方式的重叠I/0情况下,当然重叠I/O不一定非使用完成端口不可
在我的代码里并没有实现I0CP,但是重叠I/0是有的
而刚才这位朋友问我的是重叠I/0,并非I0CP
我建议先去看下重叠I/0的定义
我觉得你的话说的太过分了
首先我不会在没把问题想清楚之前给予答复
当然从哲学上来说,没有什么东西是肯定正确的
所以我的答复只能代表我的观点
你有权利对我的每一个帖子进行批驳,我也会非常欢迎你的存在
如果有一个能在我出现错误的时候提醒我,是种不错的 感觉
我为盾,你作矛,希望矛与盾共同成长
但是在这个游戏中有一个我们都必须遵守一个原则“尊重对方”
我不会和任何不懂尊重为何物的人有任何的关系
|
能力值:
( LV8,RANK:130 )
|
-
-
31 楼
27楼怎么总是找北极星的碴呢?你根本就是把IO CompletionPort和Overlapped IO混为一谈了,说人家误导他人,先好好看一下你自己有没有犯错吧
|
能力值:
( LV2,RANK:10 )
|
-
-
32 楼
最初由 drwch 发布 27楼怎么总是找北极星的碴呢?你根本就是把IO CompletionPort和Overlapped IO混为一谈了,说人家误导他人,先好好看一下你自己有没有犯错吧
我当然知道重叠IO和完成端口是两回事,重叠io是完成端口的基础。
重叠IO能作的,完成端口也能作
我这样说只是为了提醒北极星注意而已,并没有别的意思。
|
能力值:
( LV2,RANK:10 )
|
-
-
33 楼
网速真慢
北极星的建议我会采用的。
你的程序的确也不错,一个管道一个线程,这个重叠IO用的真好。
|
能力值:
( LV2,RANK:10 )
|
-
-
34 楼
再次谢谢版主了!
|
能力值:
( LV2,RANK:10 )
|
-
-
35 楼
终于找到了
|
能力值:
(RANK:210 )
|
-
-
36 楼
谢谢『Win32/Win64编程』版主!好东西!
|
能力值:
(RANK:210 )
|
-
-
37 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
38 楼
开场白中对管道的描述能否更宏观点,如:所用的场合、威力(原谅用词),近似或竞争的技术,技术特点大比拼等。让读者知道,他就是暂时不深入了解管道,但在该用的场合一定不会忘记它,而且选择了最合适恰当的技术。
上传的文件为:VC工程化的项目,非常便于调试。工具用的好,效益太多了。 该在这里回了。
|
能力值:
( LV2,RANK:10 )
|
-
-
39 楼
可以告诉读者命名管道的问题:
1、仅局域网中适用,还是可用于互联网。
2、如果用于互联网,采用什么协议?如何穿透防火墙?
3、近似的信息通信(远程对象访问),如早期的CORBAR、后来的j2ee和.Net,他们的信息交互和反馈方便多了,编程时思路也清晰。因此,你要突出你的特定的适用性,让读者知道什么时候该选命名管道,什么时候选其它的。
|
能力值:
( LV2,RANK:10 )
|
-
-
40 楼
谢谢北极星2003给我们带来这么多的学习资料!希望学习后也能给论坛做出贡献!
|
能力值:
( LV2,RANK:10 )
|
-
-
41 楼
非常好啊
我这个暑假看了那本《软件加密技术内幕》觉得非常好,所以我就去买了一本。
可让我感到有点可惜的是,我竟然晚知道了这本书的内容有一年之久。
如果能在一年前看到这本书的话,那就Perfect了。
|
能力值:
( LV2,RANK:10 )
|
-
-
42 楼
LPTSTR lpProgram = new char( sizeof(argv[1]) ) ;
strcpy ( lpProgram, argv[1] ) ;
上面sizeof(argv[1]) 应该是strlen(argv[1]+1)吧,如果不是为何不直接new char[4];
|
能力值:
( LV2,RANK:10 )
|
-
-
43 楼
谢谢楼主的贡献。不过程序中还有一个小问题我搞不定:
当客户端发送空的数据时也就是szBuf的长度为0时
// 把数据写入管道
WriteFile ( hPipe, szBuf, strlen(szBuf), &nWriteByte, NULL ) ; 服务端就会挂在ServerThread这里:
// 从管道中读取客户端的请求信息
if ( !ReadFile ( CurPipeInst.hPipe, szBuf, MAX_BUFFER_SIZE, &nReadByte, NULL ) )
{
MessageBox ( 0, "读取管道错误!", 0, 0 ) ;
break ;
} 换句话说当客户端的WriteFile中的szBuf为0时,服务端会阻塞在ReadFile
|
能力值:
(RANK:1010 )
|
-
-
44 楼
最初由 taishan911 发布 LPTSTR lpProgram = new char( sizeof(argv[1]) ) ; strcpy ( lpProgram, argv[1] ) ;
上面sizeof(argv[1]) 应该是strlen(argv[1]+1)吧,如果不是为何不直接new char[4];
你说的对
这个错误8楼也提出过了,也不知道怎么回事忘了改了
|
能力值:
(RANK:1010 )
|
-
-
45 楼
最初由 wangwolue 发布 谢谢楼主的贡献。不过程序中还有一个小问题我搞不定:
当客户端发送空的数据时也就是szBuf的长度为0时
// 把数据写入管道 ........
当写入0字节的消息时,ReadFile确实会等待
这也是个BUG,应该在写入消息时检测消息长度,若长度为0,则给出提示信息且不让写
多谢指出
|
|
|