if WSAASyncSelect(ServerSocket, glDialog , WM_ASYNCSELECT, FD_ACCEPT or FD_READ or FD_CLOSE) <> 0 then begin closesocket(ServerSocket); result := false; Exit; end;
设置成非阻塞模式
自己使用api实现,应该会比较稳定啊 可能是上面说的模式不对
把 bBolck:=0; 改为 bBolck:=1;
oh~,我的神,为什么我搞不定它? 将bBlock:=1; //var FD: TFDSet; TimeVal: TTimeVal; {其他代码不变} while True do begin FD_ZERO(FD); FD_SET(SocketServer, FD); TimeVal.tv_sec := 0; TimeVal.tv_usec := 500; if (select(0, @FD, nil, nil, @TimeVal) > 0) then {哎,利用select对socket进行超时检查。早知道把文章看完了。在循环时,貌似在对Form的WM_Close没有响应,估计又堵了。} begin AddrSize := SizeOf(AddrClient); ClientSocket := accept(SocketServer, @AddrClient, @AddrSize); if ClientSocket <> INVALID_SOCKET then TSocketRead.Create(ClientSocket, mmoLog) else closesocket(ClientSocket); Application.ProcessMessages; end; end;
if WSAASyncSelect(ServerSocket, glDialog , WM_ASYNCSELECT, FD_ACCEPT or FD_READ or FD_CLOSE) <> 0 then
begin
closesocket(ServerSocket);
result := false;
Exit;
end;
设置成非阻塞模式
可能是上面说的模式不对
bBolck:=0;
改为
bBolck:=1;
将bBlock:=1; //var
FD: TFDSet;
TimeVal: TTimeVal;
{其他代码不变}
while True do
begin
FD_ZERO(FD);
FD_SET(SocketServer, FD);
TimeVal.tv_sec := 0;
TimeVal.tv_usec := 500;
if (select(0, @FD, nil, nil, @TimeVal) > 0) then {哎,利用select对socket进行超时检查。早知道把文章看完了。在循环时,貌似在对Form的WM_Close没有响应,估计又堵了。}
begin
AddrSize := SizeOf(AddrClient);
ClientSocket := accept(SocketServer, @AddrClient, @AddrSize);
if ClientSocket <> INVALID_SOCKET then
TSocketRead.Create(ClientSocket, mmoLog)
else
closesocket(ClientSocket);
Application.ProcessMessages;
end;
end;
bBolck:=1;
ioctlsocket(SocketServer,FIONBIO,bBolck);
有这么写socket的吗?你去看看scktcomp.pas