请求winsocket api解答?

hehou 2002-09-10 08:50:11
1、当server处于listen状态时,因为accept调用会产生阻塞,所以要采用什么方法调用客户端的请求,防止阻塞。
2、同上问一样,客户端的connect也是可样的。又如何解决呢?
...全文
37 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hehou 2002-09-11
  • 打赏
  • 举报
回复
THANK。
大部分问题己解决。(是指消息方式)
结账
wisenowa 2002-09-10
  • 打赏
  • 举报
回复
这个处理过程可能会陷入死循环,这可能不是最后的版本
wisenowa 2002-09-10
  • 打赏
  • 举报
回复
我说一下WSAAsyncSelect吧,我的拙见

他有4各参数
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的两个方法就明白了
tongdings 2002-09-10
  • 打赏
  • 举报
回复
gz
hehou 2002-09-10
  • 打赏
  • 举报
回复
to: wisenowa(127.0.0.1)
异步消息选择机制 WSAAsyncSelect

这种方法我也有一点了解,但是做一个listen线程,也可能不必要吧。假如,只打开一个监听,当有连接时再去创建一个线程来处理套间字来处理数据的接收和发送。现在问题就是如何取得客户端的连接请求呢,我试过处于监听状态时,客户端请求连接,服务器会有一个信号。然后再调用accept采不用阻塞。(这是我用控件时发现的,但用api又如何实现呢?这也就是所谓你说的异步事件选择机制)

这个WSAAsyncSelect方法我是知道,但不知道怎样去调用。能不能说详细一点。

还有wsasetsockopt、wsagetsockopt和ioctlsocket用有什么重大的用处呢?
wisenowa 2002-09-10
  • 打赏
  • 举报
回复
对于你的第一个问题,你可以做一个线程,称之为Listen线程,他始终在Listening,当他收到一个连接请求后就生成另一个线程来处理这个连接,
这样做的话就不会是你的程序看起来没有反应。

对于你的第二个问题,WinSock为我们提供了2中解决办法,
1 异步消息选择机制 WSAAsyncSelect
2 异步事件选择机制
先声明我只用过第1种方法,如有不明之处,可以继续讨论。
hehou 2002-09-10
  • 打赏
  • 举报
回复
引起阻塞还有其它的API如:select\send\sendto\revc\revcform等。

我个人认为,可以绕过阻塞钩子。用某种方法或信息方式去获取客户端或服务器的状态。然后再去执行这些会阻塞指令。(也可能我的想法不对)
我虽有这种想法,但不知从那里下手。请教高手。
manprogram 2002-09-10
  • 打赏
  • 举报
回复
UP

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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