引起阻塞还有其它的API如:select\send\sendto\revc\revcform等。我个人认为,可以绕过阻塞钩子。用某种方法或信息方式去获取客户端或服务器的状态。然后再去执行这些会阻塞指令。(也可能我的想法不对)
我虽有这种想法,但不知从那里下手。请教高手。
我虽有这种想法,但不知从那里下手。请教高手。
解决方案 »
- 切割原料的数学建模编程算法问题
- project test.exe raised exception class Escoketerror???
- 一个麻烦的问题,请经验人士帮忙解决!!!!
- bde 和 sql server 2000连接的问题,谁能解决给高分(300分)!!!
- 怎样将文字输出为图像?
- 请教一个问题!
- 我在delphi6中写WebServices,现出"XML document must have a top level element. Line : 0"错误,我该如何解决??
- Form的ShowModal是否会将Form上的内容重画?
- 谁知道CORBA跨网段的应用
- 用Delphi实现串口通讯
- 为什么我做的一组SpeedButtom一运行四个都是反白,不能用不知是何原因.非常感谢!
- 求助!sql server 种子 自动标识 递增 在delphi中突然不可用??:(,嘴气歪了
这样做的话就不会是你的程序看起来没有反应。对于你的第二个问题,WinSock为我们提供了2中解决办法,
1 异步消息选择机制 WSAAsyncSelect
2 异步事件选择机制
先声明我只用过第1种方法,如有不明之处,可以继续讨论。
异步消息选择机制 WSAAsyncSelect这种方法我也有一点了解,但是做一个listen线程,也可能不必要吧。假如,只打开一个监听,当有连接时再去创建一个线程来处理套间字来处理数据的接收和发送。现在问题就是如何取得客户端的连接请求呢,我试过处于监听状态时,客户端请求连接,服务器会有一个信号。然后再调用accept采不用阻塞。(这是我用控件时发现的,但用api又如何实现呢?这也就是所谓你说的异步事件选择机制)这个WSAAsyncSelect方法我是知道,但不知道怎样去调用。能不能说详细一点。还有wsasetsockopt、wsagetsockopt和ioctlsocket用有什么重大的用处呢?
1, 套接口
2,接受系统发来的消息的句柄
3, 消息,就是当某一网络事件发生时产生的消息,有你自己来定义
4, 你所想要的事件, 如FD_CONNECT等等
例如
WSAAsyncSelect(Socket ,Handle, WM_MYSOCKMSG, FD_READ or FD_WRITE);
参数是随手写来的 然后你就可以在句柄为Handle的窗口中处理WM_MYSOCKMSG消息以及相应的事件
下面是我的处理过程剪段,看看能否帮助你
procedure TForm1.WMThreadMsg(var Msg: TCMSocketMessage);
var
Str: string;
RecLen: Longint;
begin
case Msg.SelectEvent of
FD_READ:
begin
begin
RecLen := ReadPacket(pointer(nil)^, -1, Msg.Socket);
SetLength(Str, RecLen);
if Readpacket(Pointer(Str)^, RecLen, Msg.Socket) = SOCKET_ERROR then
ShowMessage('Read Error!')
else
ShowMessage(Str);
SendPacket(Pointer(Str)^, Length(Str), Msg.Socket);
end;
end;
FD_WRITE:
begin
if Msg.Socket = FCSock then
begin
Str := 'ABCDEFGHIJ';
if SendPacket(Pointer(Str)^, Length(Str), Msg.Socket) = SOCKET_ERROR then
ShowMessage('Send Error!')
else
ShowMessage('Send OK');
end;
end;
end;
end;你所说“然后再调用accept采不用阻塞“只是你看到的表面现象,看看类TServerAcceptThread的两个方法就明白了
大部分问题己解决。(是指消息方式)
结账