немного переписал, получилось такое (нашел пример в инете):
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils,
Windows,
WinSock;
var
Sockets:array of TSocket;
Addr:TSockAddr;
Data:TWSAData;
Len,I,J:Integer;
FDSet:TFDSet;
buf : string;
const
CPort = Word(12345);
begin
WriteLn('starting application...');
if WSAStartup($101,Data) <> 0 then halt(1);
SetLength(Sockets,1);
Sockets[0]:=Socket(AF_Inet,Sock_Stream,0);
WriteLn(format('creating socket on port [%d].',[CPort]));
if Sockets[0] = invalid_socket then halt(1);
Addr.sin_family:=AF_Inet;
Addr.sin_port:=htons(CPort);
Addr.sin_addr.S_addr:=InAddr_Any;
FillChar(Addr.Sin_Zero,SizeOf(Addr.Sin_Zero),0);
if bind(Sockets[0],Addr,SizeOf(TSockAddr)) <> 0 then halt(1);
WriteLn('binding socket...');
if listen(Sockets[0],SoMaxConn) <> 0 then halt(1);
WriteLn('socket status: listening.');
while True do
begin
// 1. Формирование множества сокетов
FD_Zero(FDSet);
for I:=0 to High(Sockets) do
FD_Set(Sockets[I],FDSet);
// 2. Проверка готовности сокетов
Select(0,@FDSet,nil,nil,nil);
// 3. Чтение запросов клиентов тех сокетов, которые готовы к этому
I:=1;
while I<=High(Sockets) do
begin
if FD_IsSet(Sockets[I],FDSet) then
if Recv(Sockets[I],buf, SizeOf(buf),0)<=0 then
begin
// Связь разорвана, надо закрыть сокет
// и удалить его из массива
CloseSocket(Sockets[I]);
for J:=I to High(Sockets)-1 do
Sockets[J]:=Sockets[J+1];
Dec(I);
SetLength(Sockets,Length(Sockets)-1)
end
else
begin
writeln('recv -',buf);
Send(Sockets[I],buf, SizeOf(buf), 0);
writeln('send - ', buf);
end;
Inc(I)
end;
// 4. Проверка подключения нового клиента
if FD_IsSet(Sockets[0],FDSet) then
begin
// Подключился новый клиент
SetLength(Sockets,Length(Sockets)+1);
Len:=SizeOf(TSockAddr);
Sockets[High(Sockets)]:=Accept(Sockets[0],@Addr,@Len)
end;
end;
end.
Как только пытаюсь подключиться клиентом к серверу и отправить сообщение на сервер, клиент вылетает с сообщением:
"Ошибка при получении ответа от сервера: удаленный хост принудительно разорвал существующее подключение".
При этом, сервер вылетает и делфи указывает на строку: I:=1; (цикл для чтения запросов)
В чем может быть проблема?