Friday January 20 2006 17:36, Igor Yegorkin wrote to Alexander Vedjakin:
>> >> 3) понятия timeout проверки ошибочности сокета у тебя не
>> >> существует
IY> И чем это черевато? Чтение или запись ошибочного сокета покажут
IY> ошибку потом. Может ли сокет закрыться незаметно?
IY> Можно положиться на отсутствие терпения у клиента или сервера,
IY> подключённых к нашей программе, "вечных" подключений не будет.
Ты забываешь о канале, между сервером и клиентом, а там может быть все.
>> А по большому счету: тебе желательно запихнуть в Select все два
>> сокета, из которого первого пришли данные, из того и бум читать,
>> отсылая прочитанное в соседний сокет.
IY> Как узнать, из какого именно сокета пришли данные, если передать два
IY> сокета?
сокеты должны быть уже соединения - что-то типа этого:
procedure mapsock( S1,S2: tsocket);
var
FDSet : TFDSet;
TimeVal: TTimeVal;
WW : integer;
Buf : array[1..8*1024] of byte;
S : PSocket;
begin
FillChar(TimeVal,SizeOf(TimeVal),0);
TimeVal.tv_sec := valMaxReadTime;
repeat
FDSet.fd_count := 2;
FDSet.fd_array[0] := S1;
FDSet.fd_array[1] := S2;
if (Select(@FDSet,nil,nil,@TimeVal) < 1) or (FDSet.fd_Count = 0) then
Break;
WW := RecvSock(FDSet.fd_array[0],Buf,SizeOf(Buf));
if WW = -1 then Break;
if FDSet.fd_array[0].Socket = S1 then S := S2
else S := S1;
if not (SendSock(S^,Buf,WW)) then Break;
until false;
CloseSocket(S1);
CloseSocket(S2);
end;
>>>> 5) Интересно, а если создать 50 StartServer'ов, она будет
>>>> продолжать работать так же? У меня IDE сейсас не стоит, но
>>>> сдается, что будут проблемы с 50 accept'ами сразу.
>> IY> как решить проблему?
>> Все тот же Select
IY> Куда его прикрутить?
Собираешь TFdSet (по моему максимум можно 64 сокета туда положить), а дальше
ждешь Select'ом, кто из них захочет прочитаться (не забудь еще и ошибочность
проверять - вдруг, кто-то сокет закроет), потом береш первый сокет и делаешь на
него Accept - далее делаешь с ним, что хочешь в новом потоке, а в этом
возращаешься снова на Select
Alexander
■ Mr. President of Piafi SoftIntl
■ E-Mail: m...@piafi.ru; ICQ: 6339061
> http://www.piafi.ru/