| 发表于:2008-01-22 14: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跟我的程序逻辑是不是冲突,请高手看一下。为什么会这样呢?是不是本身我就不应该使用这个函数在这里重置。。 请高手出马啊。。。。。。。。。 |
|
|
|
|