游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3328|回复: 8

急,请教关于完成端口

[复制链接]

60

主题

134

帖子

134

积分

注册会员

Rank: 2

积分
134
QQ
发表于 2007-7-2 16:11:00 | 显示全部楼层 |阅读模式
服务器端程序当用GetQueuedCompletionStatus得到OP_READ时,表示本机已经有了外部计算机发来的数据,用WSARecv接受就行,但是在服务器端怎样得到“OP_WRITE”呢?即怎样才能向客户段发送数据?

2

主题

79

帖子

85

积分

注册会员

Rank: 2

积分
85
QQ
发表于 2007-7-2 19:56:00 | 显示全部楼层

Re: 急,请教关于完成端口


    首先,你还没有理解完成端口的工作原理,完成端口跟事件形式(如message,event)的工作是相反的过程,你把它们当成一样的过程,是错误的。

    事件形式是先发生数据交互,然后有动作。但是完成端口是恰好相反,它是先预提交动作,然后等待有数据交互,最后得到的已经是结果了。

    WSARecv在调用时是个预提交动作,当有数据包到达时,系统会将数据填充到你调用WSARecv时指定的缓冲区,所以当你GetQueuedCompletionStatus返回OP_READ时,表明数据包已经接收到你的缓冲区里,你可以使用里面的数据了,而并不是返回OP_READ时再调用WSARecv才有数据。

    WSASend是个发送动作,它在完成端口形式下,只是把你要发送的数据提交给操作系统,当你用WSASend发送时,系统对它的操作其实跟其它事件形式的发送一样,只不过当它完成这个发送操作时,以完成端口的通知形式通知你了。

    所以,你要发送数据时,只要调用WSASend,设定好相应的参数,当数据发送完成时,GetQueuedCompletionStatus就会返回OP_WRITE,表明你上次提交的动作已经完成,你只要查看结果,而不是先有OP_WRITE,再调用WSASend!!

60

主题

134

帖子

134

积分

注册会员

Rank: 2

积分
134
QQ
 楼主| 发表于 2007-7-3 12:21:00 | 显示全部楼层

Re:急,请教关于完成端口

“WSARecv在调用时是个预提交动作,当有数据包到达时,系统会将数据填充到你调用WSARecv时指定的缓冲区,所以当你GetQueuedCompletionStatus返回OP_READ时,表明数据包已经接收到你的缓冲区里,你可以使用里面的数据了,而并不是返回OP_READ时再调用WSARecv才有数据。”
这句我不是太理解:WSARecv是在本机的一个预提交动作么?还是远程计算机来数据后触发的OP_READ?
我始终调不过弯来。

0

主题

172

帖子

176

积分

注册会员

Rank: 2

积分
176
发表于 2007-7-3 12:33:00 | 显示全部楼层

Re:急,请教关于完成端口

好比告诉门口传达室的老大爷,今天我会有个包裹,如果到了,直接帮我送过来。

而不是到了给我电话,我下去拿。

60

主题

134

帖子

134

积分

注册会员

Rank: 2

积分
134
QQ
 楼主| 发表于 2007-7-3 13:42:00 | 显示全部楼层

Re:急,请教关于完成端口

帮我解释一下;
case OP_READ:
         // Process the data read     
         // ...

         // Repost the read if necessary, reusing the same
         // receive buffer as before
         memset(&OverlapPlus->ol, 0, sizeof(OVERLAPPED));
         ret = WSARecv(
               OverlapPlus->s,
               &OverlapPlus->wbuf,
               1,
               &OverlapPlus->dwBytes,
               &OverlapPlus->dwFlags,
               &OverlapPlus->ol,
               NULL);

         if (ret == SOCKET_ERROR)
         {
             if (WSAGetLastError() != WSA_IO_PENDING)
             {
                 // Error
             }
         }
         break;
这不是还是需要得到OP_READ,用WSARecv接收数据?!

6

主题

471

帖子

1047

积分

金牌会员

Rank: 6Rank: 6

积分
1047
发表于 2007-7-3 14:10:00 | 显示全部楼层

Re:急,请教关于完成端口

accept后调用一个WSARecv等待数据.等OP_READ触发后接受数据.
(数据在GetQueuedCompletionStatus回掉给你LPOVERLAPPED中)
再调用WSARecv等待下一个数据.

0

主题

172

帖子

176

积分

注册会员

Rank: 2

积分
176
发表于 2007-7-3 21:48:00 | 显示全部楼层

Re:急,请教关于完成端口

汗一下,LZ你自己贴的代码注释都写明了,怎么还在绕不清楚。。。。。

// Process the data read     
// ...
//这里是处理上一个投递的WSARecv完成事件获得的数据

// Repost the read if necessary, reusing the same
// receive buffer as before
//如果必要的话(需要继续监听),再和上一次一样,投递一个WSARecv

1

主题

30

帖子

34

积分

注册会员

Rank: 2

积分
34
发表于 2008-8-29 17:29:00 | 显示全部楼层

Re:急,请教关于完成端口

可以和您谈谈吗?

我公司高薪诚聘服务端开发人员:
有意请联系我:
QQ:834188853

35

主题

1735

帖子

1739

积分

金牌会员

Rank: 6Rank: 6

积分
1739
QQ
发表于 2008-8-29 22:45:00 | 显示全部楼层

Re:急,请教关于完成端口

搞服务端编程的人还真不少哩。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-21 11:47

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表