Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.03.25;
Скачать: CL | DM;

Вниз

Проблема с соединением сокетов   Найти похожие ветки 

 
ShaH ©   (2002-01-08 11:08) [0]

Есть клиент и сервер, общающиеся друг с другом через сокеты.
После того, как сервер соединился с клиентом он прекращает прослушивать сокет на предмет соединения. Клиент в какой-то момент обнаруживает ошибку и грохает свой сокет, открывает новый и опять пытается соединиться. Сервер в этот момент не ждет соединения, однако клиент на запрос соединения получает положительный ответ !!! Почему ? и как этого избежать ?


 
Polevi ©   (2002-01-08 17:59) [1]

Сервер всегда ждет клиента - на то он и сервер


 
ShaH ©   (2002-01-09 09:03) [2]

Я думал, что он ждет клиента только когда ему говоришь listen();
а соединяется после accept(); так какого тогда при запросе клиента connect(); ему соединение разрешается, если в этот момент вышеуказанные команды сервер не выполняет ?????


 
Polevi ©   (2002-01-09 10:18) [3]

scktcomp.pas

procedure TCustomWinSocket.CMSocketMessage(var Message: TCMSocketMessage);

function CheckError: Boolean;
var
ErrorEvent: TErrorEvent;
ErrorCode: Integer;
begin
if Message.SelectError <> 0 then
begin
Result := False;
ErrorCode := Message.SelectError;
case Message.SelectEvent of
FD_CONNECT: ErrorEvent := eeConnect;
FD_CLOSE: ErrorEvent := eeDisconnect;
FD_READ: ErrorEvent := eeReceive;
FD_WRITE: ErrorEvent := eeSend;
FD_ACCEPT: ErrorEvent := eeAccept;
else
ErrorEvent := eeGeneral;
end;
Error(Self, ErrorEvent, ErrorCode);
if ErrorCode <> 0 then
raise ESocketError.CreateResFmt(@sASyncSocketError, [ErrorCode]);
end else Result := True;
end;

begin
with Message do
if CheckError then
case SelectEvent of
FD_CONNECT: Connect(Socket);
FD_CLOSE: Disconnect(Socket);
FD_READ: Read(Socket);
FD_WRITE: Write(Socket);
FD_ACCEPT: Accept(Socket);
end;
end;

procedure TServerWinSocket.Accept(Socket: TSocket);
var
ClientSocket: TServerClientWinSocket;
ClientWinSocket: TSocket;
Addr: TSockAddrIn;
Len: Integer;
OldOpenType, NewOpenType: Integer;
begin
Len := SizeOf(OldOpenType);
if getsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, PChar(@OldOpenType),
Len) = 0 then
try
if FServerType = stThreadBlocking then
begin
NewOpenType := SO_SYNCHRONOUS_NONALERT;
setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, PChar(@NewOpenType), Len);
end;
Len := SizeOf(Addr);
ClientWinSocket := WinSock.accept(Socket, @Addr, @Len);
if ClientWinSocket <> INVALID_SOCKET then
begin
ClientSocket := GetClientSocket(ClientWinSocket);
if Assigned(FOnSocketEvent) then
FOnSocketEvent(Self, ClientSocket, seAccept);
if FServerType = stThreadBlocking then
begin
ClientSocket.ASyncStyles := [];
GetServerThread(ClientSocket);
end;
end;
finally
Len := SizeOf(OldOpenType);
setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, PChar(@OldOpenType), Len);
end;
end;




Страницы: 1 вся ветка

Текущий архив: 2002.03.25;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.009 c
3-80450
First
2002-02-26 08:42
2002.03.25
Безопасность интербейсовской базы


3-80416
UncleRu
2002-02-19 20:08
2002.03.25
Транзакция. Как это сделать?


3-80431
MetallAdm
2002-02-27 11:13
2002.03.25
Хех Филтрация или как ? Нужно в табличке ненужные надписи убирать


3-80397
Demon ltd
2002-02-20 15:22
2002.03.25
работа с Qreport ом


1-80486
d_oleg
2002-03-12 15:54
2002.03.25
Color memo