procedure TServerSocket.Create;
var
SystemInfo: TSystemInfo;
i: Integer;
Thread: TThread;
Addr: TSockAddr;
WSData: TWSAData;
begin
try
if WSAStartup({1}202, WSData) <> 0 then
begin
raise ESocketError.Create('WSAStartup');
end;
//初始化完成端口
FIOCPHandle := CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 0);
if FIOCPHandle = 0 then
CheckError;
//初始化工作线程
GetSystemInfo(SystemInfo);
for i := 0 to SystemInfo.dwNumberOfProcessors * 2 -1 do
begin
Thread := TWorkThread.Create(Self);
FThreads.Add(Thread);
end;
//建立套接字
FSocket := WSASocket(PF_INET, SOCK_STREAM, 0, nil, 0, WSA_FLAG_OVERLAPPED);
if FSocket = INVALID_SOCKET then CheckError;
FillChar(Addr, SizeOf(TSockAddr), 0);
Addr.sin_family := AF_INET;
Addr.sin_port := htons(FPort);
Addr.sin_addr.S_addr := htonl(INADDR_ANY);
CheckError(bind(FSocket, @Addr, SizeOf(TSockAddr)), 'bind');
//开始监听
CheckError(listen(FSocket, 5), 'listen');
FAcceptThread := TAcceptThread.Create(Self);
except
on E: Exception do
begin
Close;
CheckError(GetLastError, E.Message);
end;
end;
end;