使用winsock2的accept问题 ( 积分: 20 )

  • 主题发起人 主题发起人 云里雾里
  • 开始时间 开始时间

云里雾里

Unregistered / Unconfirmed
GUEST, unregistred user!
var
SockAddr: TSockAddr;
AddrLen: integer;
begin
......
FAccept := Accept(FListen, nil, nil); //使用Delphi封装的winsock its OK
FAccept := Accept(FListen, @SockAddr, AddrLen);//使用winsock2 error=10014
end;

下载的winsock2.pas里面accept定义如下:
// Using "var addr:TSockAddr" in accept makes impossible to compile for IPv6
function accept(s: TSocket; addr: PSockAddr; var addrlen: Integer): TSocket; stdcall;

是不是这里定义错了啊?
 
var
SockAddr: TSockAddr;
AddrLen: integer;
begin
......
FAccept := Accept(FListen, nil, nil); //使用Delphi封装的winsock its OK
FAccept := Accept(FListen, @SockAddr, AddrLen);//使用winsock2 error=10014
end;

下载的winsock2.pas里面accept定义如下:
// Using "var addr:TSockAddr" in accept makes impossible to compile for IPv6
function accept(s: TSocket; addr: PSockAddr; var addrlen: Integer): TSocket; stdcall;

是不是这里定义错了啊?
 
都没人看到就下去了?
 
没有定义错,这个只是不同的定义,
AddrLen:=SizeOf(SockAddr); //winsock2.pas
FAccept := Accept(FListen, @SockAddr, AddrLen);
 
OK了,还有个问题再帮我看看,没法子,偶穷啊:P

S端用的是重叠IO模式做回应服务器,我打算这样做:
主线程用来循环监听端口,接收请求的连接,然后在这个套接字上配合一个
WSAOVERLAPPED结构投递第一个WSARecv请求,然后进入第二个线程等待操作完成
repeat
FAccept := Accept(FListen, @SockAddr, AddrLen);
until FAccept <> invalid_socket;
但是上面这个循环就把CPU耗得差不多了,有另外好点的法子吗?
简单说说思路就行了

比如WSAAsyncSelect方式下,有特定的Message响应,如果是FD_ACCEPT就接收连接,
那样很爽啊
 
再弄上去
 
难道大家都用的这个笨法子吗?
 
再顶一下
 
写到线程里面去吧 .
 
to leaber
写在线程里面也是会耗光CPU的
我觉得不是写在哪的问题,
而是使用循环接收SOCKET的方法有改进的可能啊
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
691
import
I
I
回复
0
查看
1K
import
I
I
回复
0
查看
724
import
I
后退
顶部