首页
社区
课程
招聘
Windows系统编程之进程间通信
2006-5-25 14:18 38880

Windows系统编程之进程间通信

2006-5-25 14:18
38880
收藏
点赞7
打赏
分享
最新回复 (44)
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
北极星2003 25 2006-6-26 17:32
26
0
最初由 ateddybear 发布
首先对楼主贡献的资料深感谢意.刚好要用到这方面的东西,真是雪中送碳.
但这里还有一些问题要请教楼主
1)在查找命名管道资料地过程中也看了<WINDOWS网络编程技术>这本书,其中讲到
实现对管道实例的处理有两种方法,一是通过多线程,每个线程处理一个实例,
二是通过IO重叠机制.但楼主的例子中两者都用到了.所以我想了解一下IO重叠机制的原理是什么?在什么情况下用得着?
........


IO重叠的目标是实现异步I/0
个人感觉在C/S中使用管道是个比较好的选择
每个客户端都使用一个特定的管道与服务器进行独立交互
与TCP有点相似的是,在进行数据传输之前,会建立连接
另外,客户端有处理的速度不通的问题,可以使用异步I/0,配合等待函数
一般使用的是一个管道对应一个线程,
如果客户端多的话,可以使用线程池,即多量的管道对应少量的线程
关于这方面知识,过两天(大概28号以后)我会详细介绍的,最近脱不开身
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bates 2006-6-26 17:34
27
0
to ateddybear:
    我简单的看了下代码,北极星并没有实现重叠IO,虽然文章里面提到了重叠IO,但是他并没有实现。
    他还是用每个客户端一个线程的方法来处理的。
    要实现重叠IO的话,代码绝对不止这些,还要复杂N倍,你到网上搜一下IOCP,就会有N多例子代码。
    ATL里面也有个简单的IOCP实现,可以看一下。
   
北极星:你在没有搞清楚一些问题之前,最好不要发表出来,会误导别人的。(或者我对重叠IO的理解,跟你的理解不一样)
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
nbw 24 2006-6-26 17:35
28
0
最初由 北极星2003 发布
IO重叠的目标是实现异步I/0
个人感觉在C/S中使用管道是个比较好的选择
每个客户端都使用一个特定的管道与服务器进行独立交互
与TCP有点相似的是,在进行数据传输之前,会建立连接
另外,客户端有处理的速度不通的问题,可以使用异步I/0,配合等待函数
........


同情以下
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bates 2006-6-26 17:39
29
0
北极星老大要写完成端口了啊
搬个凳子学习。
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
北极星2003 25 2006-6-26 17:57
30
0
最初由 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的定义

我觉得你的话说的太过分了
首先我不会在没把问题想清楚之前给予答复
当然从哲学上来说,没有什么东西是肯定正确的
所以我的答复只能代表我的观点

你有权利对我的每一个帖子进行批驳,我也会非常欢迎你的存在
如果有一个能在我出现错误的时候提醒我,是种不错的 感觉
我为盾,你作矛,希望矛与盾共同成长

但是在这个游戏中有一个我们都必须遵守一个原则“尊重对方”
我不会和任何不懂尊重为何物的人有任何的关系
雪    币: 222
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
drwch 3 2006-6-26 18:03
31
0
27楼怎么总是找北极星的碴呢?你根本就是把IO CompletionPort和Overlapped IO混为一谈了,说人家误导他人,先好好看一下你自己有没有犯错吧
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bates 2006-6-26 18:20
32
0
最初由 drwch 发布
27楼怎么总是找北极星的碴呢?你根本就是把IO CompletionPort和Overlapped IO混为一谈了,说人家误导他人,先好好看一下你自己有没有犯错吧


我当然知道重叠IO和完成端口是两回事,重叠io是完成端口的基础。
重叠IO能作的,完成端口也能作

我这样说只是为了提醒北极星注意而已,并没有别的意思。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bates 2006-6-26 18:28
33
0
网速真慢

北极星的建议我会采用的。
你的程序的确也不错,一个管道一个线程,这个重叠IO用的真好。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ateddybear 2006-6-27 23:04
34
0
再次谢谢版主了!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lgd 2006-7-4 21:33
35
0
终于找到了
雪    币: 1098
活跃值: (193)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
zhuliang 5 2006-7-6 14:41
36
0
谢谢『Win32/Win64编程』版主!好东西!
雪    币: 1098
活跃值: (193)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
zhuliang 5 2006-7-15 17:32
37
0
最初由 laomms 发布
值得学习!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sunbaiy 2006-7-18 15:01
38
0
开场白中对管道的描述能否更宏观点,如:所用的场合、威力(原谅用词),近似或竞争的技术,技术特点大比拼等。让读者知道,他就是暂时不深入了解管道,但在该用的场合一定不会忘记它,而且选择了最合适恰当的技术。

上传的文件为:VC工程化的项目,非常便于调试。工具用的好,效益太多了。

该在这里回了。
上传的附件:
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sunbaiy 2006-7-18 15:24
39
0
可以告诉读者命名管道的问题:
1、仅局域网中适用,还是可用于互联网。
2、如果用于互联网,采用什么协议?如何穿透防火墙?
3、近似的信息通信(远程对象访问),如早期的CORBAR、后来的j2ee和.Net,他们的信息交互和反馈方便多了,编程时思路也清晰。因此,你要突出你的特定的适用性,让读者知道什么时候该选命名管道,什么时候选其它的。
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
CoolGo 2006-8-11 15:37
40
0
谢谢北极星2003给我们带来这么多的学习资料!希望学习后也能给论坛做出贡献!
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
adly 2006-8-21 11:26
41
0
非常好啊

我这个暑假看了那本《软件加密技术内幕》觉得非常好,所以我就去买了一本。

可让我感到有点可惜的是,我竟然晚知道了这本书的内容有一年之久。
如果能在一年前看到这本书的话,那就Perfect了。
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
taishan911 2006-9-7 17:10
42
0
LPTSTR lpProgram = new char( sizeof(argv[1]) ) ;
  strcpy ( lpProgram, argv[1] ) ;

上面sizeof(argv[1]) 应该是strlen(argv[1]+1)吧,如果不是为何不直接new char[4];
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wangwolue 2006-9-8 16:17
43
0
谢谢楼主的贡献。不过程序中还有一个小问题我搞不定:

当客户端发送空的数据时也就是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
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
北极星2003 25 2006-9-8 16:57
44
0
最初由 taishan911 发布
LPTSTR lpProgram = new char( sizeof(argv[1]) ) ;
strcpy ( lpProgram, argv[1] ) ;

上面sizeof(argv[1]) 应该是strlen(argv[1]+1)吧,如果不是为何不直接new char[4];

你说的对
这个错误8楼也提出过了,也不知道怎么回事忘了改了
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
北极星2003 25 2006-9-8 16:59
45
0
最初由 wangwolue 发布
谢谢楼主的贡献。不过程序中还有一个小问题我搞不定:

当客户端发送空的数据时也就是szBuf的长度为0时

// 把数据写入管道
........


当写入0字节的消息时,ReadFile确实会等待
这也是个BUG,应该在写入消息时检测消息长度,若长度为0,则给出提示信息且不让写

多谢指出
游客
登录 | 注册 方可回帖
返回