请教关于函数WSAResetEvent的问题。
上次文了一个关于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跟我的程序逻辑是不是冲突,请高手看一下。为什么会这样呢?是不是本身我就不应该使用这个函数在这里重置。。
请高手出马啊。。。。。。。。。
代码是这样的。
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跟我的程序逻辑是不是冲突,请高手看一下。为什么会这样呢?是不是本身我就不应该使用这个函数在这里重置。。
请高手出马啊。。。。。。。。。
...全文
相关推荐
EventSocket通讯程序
```c BOOL WSAResetEvent(WSAEVENT hEvent); ```- `WSACloseEvent()`:用于关闭事件对象,释放系统资源。
Winsock模型之WSAEventSelect(事件通知)
如果设为 TRUE,函数只有在所有事件对象都已传信时才返回;如果设为 FALSE,函数将在任意一个事件对象传信时返回。
易语言客户端应用
易语言客户端应用源码,客户端应用,监听,连接,发送数据,断开连接,ResetEvent,CreateThread,WaitForSingleObject,CloseHandle,htons,inet_
利用ScktSrvr打造多功能Socket服务器
try case MsgWaitForMultipleObjects(1, Event, False, WaitTime, QS_ALLEVENTS) of WAIT_OBJECT_0: begin WSAResetEvent
CISP-CSE注册云安全工程师备考资源包基础教程
随着云计算技术的普及,云安全已成为网络安全领域的核心议题。CISP-CSE(注册云安全工程师)认证由中国信息安全测评中心颁发,旨在培养具备云安全专业知识和实践能力的实战型人才。本教程将结合"CISP-CSE注册云安全工程师备考资源包",系统性地为您梳理云安全的核心知识体系,并提供实战案例分析,助您高效备考。


网络通信/分布式开发
