请教关于函数WSAResetEvent的问题。

piaoxueskysz 2008-01-22 02:14:10
上次文了一个关于TClientWinSocket的问题。非常感谢"僵哥"的回答。经过几天的反反复复的修改测试。终于有点眉目了。
代码是这样的。
FSocket := TClientWinSocket.Create(Integer(not(0)));
//采用阻塞模式
FSocket.ClientType := ctBlocking;


try
FSocket.Open(FHost, FHost, '', 8309); //连接服务端
Timeout := 2000; //2秒超时
HadSendConn := false;
setsockopt(FSocket.SocketHandle, SOL_SOCKET, SO_RCVTIMEO, @Timeout, SizeOf(Timeout));
except
end;
PeekMessage(msg, 0, 0, 0, PM_NOREMOVE);
Event := WSACreateEvent; //创建事件句柄
try
WSAEventSelect(FSocket.SocketHandle, Event, FD_READ or FD_CLOSE);
while (not Terminated) and (FSocket.Connected=True) do
case MsgWaitForMultipleObjects(1, Event, False, 500, QS_ALLINPUT) of
//接收网络消息部分
WAIT_OBJECT_0:
begin
if IsClose(FSocket.SocketHandle, Event) then
begin
{ 'server close' ; }
Break;
end;
//***********接收数据部分*********************
RetLen := FSocket.ReceiveBuf(D.Content, D.Len);
//**********如果接收到非法消息,程序continue
wsaRecMsg := D.Content;
PostMessage(frm_wyClientMain.Handle,WM_GETMES,WParam(wsaRecMsg),Length(wsaRecMsg));
//***********接收数据结束*********
//************重置事件句柄*********
//关键是这句。如果接收到合法消息程序会到这里,事件对象状态清除为未置信号
//也就是这样一句,可能使我的socket连接存在,但是永远不会进入到读状态。
WSAResetEvent(Event);
//********************************
end;
WAIT_OBJECT_0 + 1:
begin
//发送网络消息部分
if PeekMessage(msg, 0, 0, 0, PM_REMOVE) then
begin
case msg.message of
WM_USER:
begin
//发送自定义消息 如 登陆,注销等
end;
WM_CLOSE:
begin
//发送客户端正常关闭消息
//正常退出,服务端会对数据库做相应操作
//退出线程
break;
end;
end;
end;
end;
WAIT_TIMEOUT:
begin
//线程启动时发送连接消息
if HadSendConn = false then
begin
//置已连接标志为真
HadSendConn := true;
end;
end;
end;
finally
WSACloseEvent(Event);
end;




上次僵哥说要我全部用API函数,他说可能TClientWinSocket会与我的代码有冲突。但是改了后还是一样。现在的问题是这个函数WSAResetEvent跟我的程序逻辑是不是冲突,请高手看一下。为什么会这样呢?是不是本身我就不应该使用这个函数在这里重置。。
请高手出马啊。。。。。。。。。
...全文
216 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
piaoxueskysz 2008-01-23
  • 打赏
  • 举报
回复
谢谢。。。。
昨天终于发现了,原来问题不再这里段代码,而在我服务端。服务端可以正常发送心跳消息,客户端也可以正常接收、发送消息。只是服务端接收客户端消息有阻塞。导致socket连接正常,客户端可以正常收发情况下,服务端不能返回消息。就算是我知道了这种情况,释放掉原来连接重新建立的服务端线程还是不能启动。
呵呵。害的搞了几天一直以为客户端同步或是阻塞的问题。
谢谢僵哥。分继续给上。
僵哥 2008-01-22
  • 打赏
  • 举报
回复
MSDN当中有这样一段描述,Issuing a WSAEventSelect for a socket cancels any previous WSAAsyncSelect or WSAEventSelect for the same socket and clears the internal network event record.意思也就是WSAEventSelect是可以覆盖掉原来的WSAAsyncSelect,但是如果服务器是一个主动服务(比如SMTP服务等有欢迎消息发送的,或者是完全主动推送的,那么在被覆盖掉之前会是什么情况?

另外PeekMessage当中,除了上面的几个消息,以后的消息怎么办?就算是独立的线程,那如果里面还有别的如TTimer,那么这个WM_TIMER消息不就丢弃了?

另外还是之前提到过的那个同步的问题。PostMessage不等待消息的处理。wsaRecMsg会是怎么样的一种情况?
僵哥 2008-01-22
  • 打赏
  • 举报
回复
TClientWinSocket继续于TCustomWinSocket,其Open方法在TCustomWinSocket当中有实现。当采用block模式,在Open调用过程当中就会调用TCustomWinSocket.DoOpen,而DoOpen又会调用TCustomWinSocket.DoSetAsyncStyles,在DoSetAsyncStyles当中则有一个WSAAsyncSelect,而这之后,楼主再调用WSAEventSelect,你觉得系统会听谁的?
作为Microsoft 32位平台的应用程序编程接口, Win32 API是从事Windows应用程序开发所必备的。 首先对Win32 API函数做完整的概述;然后收录五大类函数: 窗口管理、图形设备接口、系统服务、国际特性以及网络服务; 在附录部分,讲解如何在Visual Basic和Delphi中对其调用。 本书是从事Windows应用程序开发的软件工程师的必备参考手册。 控件与消息函数 共91个函数 硬件与系统函数 共98个函数 设备场景函数 共73个函数 绘图函数 共105个函数 位图、图标和光栅运算函数 共39个函数 菜单函数 共37个函数 文本和字体函数 共41个函数 打印函数 共66个函数 文件处理函数 共118个函数 进程和线程函数 共40个函数 Windows消息函数 共11个函数 网络函数 共14个函数 目 录 第一章 Win32 API概论…………………………………………………………………………1 1.1 为什么使用Win32 API …………………………………………………………………1 1.2 Win32 API简介 …………………………………………………………………………1 1.3 综述………………………………………………………………………………………11 第二章 窗口管理函数(Windows Control Function) ……………………………………13 2.1 易用特性函数(Accessibility Features)…………………………………………13 2.2 按钮函数(Button)……………………………………………………………………20 2.3 插入标记(^)函数(Caret)…………………………………………………………21 2.4 组合框函数(Combo box) ……………………………………………………………24 2.5 通用对话框函数(Common Dialog Box) ……………………………………………25 2.6 标函数(Cursor)………………………………………………………………………36 2.7 对话框函数(Dialog Box)……………………………………………………………40 2.8 编辑控制函数(Edit Control)………………………………………………………54 2.9 图标函数(Icon)………………………………………………………………………54 2.10 键盘加速器函数(Keyboard Accelerator)……………………………………… 61 2.11 键盘输入函数(Keyboard InPut) …………………………………………………63 2.12 列表框函数(List box) ……………………………………………………………75 2.13 菜单函数(Menu) ……………………………………………………………………76 2.14 消息和消息队列函数(Message and Message Queue)……………………………90 2.15 鼠标输入函数(Mouse Input) ……………………………………………………100 2.16 多文档接口函数(Multiple Document Interface) ……………………………103 2.17 资源函数(Resource)………………………………………………………………105 2.18 滚动条函数(Scroll Bar)…………………………………………………………113 2.19 窗口函数(Window)…………………………………………………………………119 2.20 窗口类函数(Window Class)………………………………………………………144 2.21 窗口过程函数(Window Procedure)………………………………………………150 2.22 窗口属性函数(Window Property) ………………………………………………152 第三章 图形设备接口函数(Graphic Device Interface Function) …………………155 3.1 位图函数(Bitmap) …………………………………………………………………155 3.2 笔刷函数(Brush)……………………………………………………………………171 3.3 剪切函数(Clipping) ………………………………………………………………176 3.4 颜色函数(Color)……………………………………………………………………179 3.5 坐标空间与变换函数(Coordinate Space Transformation)……………………186 3.6 设备环境函数(Device Context) …………………………………………………195 3.7 填充形态函数(Filled shape) ……………………………………………………211 3.8 字体和正文函数(Font and Text)…………………………………………………215 3.9 ICM 2.0函数 …………………………………………………………………………238 3.10 线段和曲线函数(Line and Curve)………………………………………………295 3.11 图元文件函数(Metafile)…………………………………………………………300 3.12 多显示器函数(Multiple Display Monitors) …………………………………311 3.13 绘图函数和画图函数(Painting and Drawing)…………………………………313 3.14 路径函数(Path)……………………………………………………………………328 3.15 画笔函数(Pen) ……………………………………………………………………332 3.16 打印及打印假脱机程序函数(Printing and Print Spooler)…………………334 3.17 矩形函数(Rectangle) ……………………………………………………………371 3.18 区域函数(Region)…………………………………………………………………374 第四章 系统服务函数(System Service Function) ……………………………………383 4.1 访问控制函数(Access Control) …………………………………………………383 4.2 原子函数(Atom) ……………………………………………………………………406 4.3 客户/服务器访问控制函数(Client/Server Access Control) ………………409 4.4 剪贴板函数(Clipboard)……………………………………………………………431 4.5 通信函数(Communication)…………………………………………………………436 4.6 控制台函数(Console)………………………………………………………………444 4.7 数据解压库函数(Data Decompression Library) ………………………………463 4.8 调试函数(Debugging)………………………………………………………………466 4.9 设备输入输出函数(Device Input and Output)…………………………………472 4.10 动态数据交换函数(Dynamic Data Exchange) …………………………………474 4.11 动态数据交换管理函数(Dynamic Data Exchange Management)………………476 4.12 动态链接库函数(Dynamic-Link Library)………………………………………489 4.13 错误函数(Error) …………………………………………………………………496 4.14 事件日志函数Event Logging) …………………………………………………499 4.15 文件函数(File)……………………………………………………………………503 4.16 文件安装库函数(File Installation Library) ………………………………542 4.17 文件映射函数(File Mapping)……………………………………………………546 4.18 文件系统函数 File System)………………………………………………………551 4.19 句柄和对象函数(Handle and Object)………………………………………………556 4.20 挂钩函数(Hook)………………………………………………………………………560 4.21 ImageHlp函数…………………………………………………………………………572 4.22 大整数操作函数(Iarge Integer Operations)……………………………………594 4.23 低层访问控制函数(Low-Level Access Control)………………………………596 4.24 LSAPI函数 …………………………………………………………………………617 4.25 邮槽函数(Mailslot)………………………………………………………………622 4.26 内存管理函数(Memory Management) ……………………………………………623 4.27 管道函数(Pipe) …………………………………………………………………655 4.28 电源管理函数(Power Management) …………………………………………… 663 4.29 进程和线程函数(Process and Thread)…………………………………………666 4.30 注册表函数(Registry)……………………………………………………………700 4.31 字符串操作函数(String Manipulation)……………………………………… 724 4.32 结构化异常处理函数(Structured Exception Handling) ……………………742 4.33 同步函数(Synchronization) ……………………………………………………745 4.34 系统信息函数(System Information)……………………………………………766 4.35 系统消息函数(System Message)…………………………………………………780 4.36 系统关机函数(System Shutdown) ………………………………………………781 4.37 磁带备份函数(Tape Backup) ……………………………………………………783 4.38 时间函数(Time)……………………………………………………………………789 4.39 计时器函数(Timer) ………………………………………………………………795 4.40 工具帮助函数(Tool Help) ………………………………………………………796 4.41 窗口站和桌面函数(Window Station and Desktop)……………………………799 4.42 Windows NT 4.0访问控制函数(Window NT 4.0 Access-Control)……………808 4.43 WinTrust函数(WinTrust)…………………………………………………………814 第五章 国际特性函数(International Peatures Punction)时性…………………………815 5.1 输入方法编辑函数(Input Method Editor)…………………………………………815 5.2 国家语言支持函数(National Language Support)………………………………… 828 5.3 Unicode和字符集函数(Unicode and Character Set)……………………………… 843 第六章 网络服务函数(Networding Service Function)……………………………………849 6.1 数据链路控制函数(DLC)………………………………………………………………849 6.2 网络函数(Net)…………………………………………………………………………849 6.3 NetBIOS函数……………………………………………………………………………896 6.4 网络DDE函数(Networking DDE)……………………………………………………897 6.5 RAS服务器管理函数(RAS Server Administration)………………………………901 6.6 远程访问服务函数(Remote Access Administration)………………………………910 6.7 服务函数(Service)……………………………………………………………………929 6.8 Windows网络函数(Windows Networking)……………………………………………930 附录1 如何在VB中调用DLL API ……………………………………………………………945 1 DLL API的声明……………………………………………………………………………945 2 DLL API的调用……………………………………………………………………………947 附录2 在Delphi中直接调用Windows API…………………………………………………953

1,594

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧