Форум: "Начинающим";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];
ВнизОшибка подскажите как исправить Найти похожие ветки
← →
KyRo (2006-12-04 12:54) [0]У меня есть сетевые клиенты которые посылают серверу текстовые сообщения. В самом начале сервер нормально работает но потом где то через час работы появляется ошибка.
Windows socket error:An operation on a socket could not performed because the the system lacked sufficient bufer space or because a queue was full (10055), on API connect
Может ли у меня происходить эта ошибка из за переполнения буфера сообщениями . Может их надо после приема освобождать DispatchMessage(Msg);
Подскажите из за чего это может быть
← →
Сергей М. © (2006-12-04 12:58) [1]
> из за чего это может быть
Из-за того что ты насоздавал слишком много гнезд.
← →
Сергей М. © (2006-12-04 13:00) [2]
> как исправить
Грамотно обрабатывать событие OnError
> on API connect
Компонент TServerSocket не может вызвать такой ошибки.
Она характерна лишь для TClientSocket.
← →
KyRo (2006-12-04 13:32) [3]
> Сергей М. © (04.12.06 13:00) [2]
>
> > как исправить
>
>
> Грамотно обрабатывать событие OnError
>
>
> > on API connect
>
>
> Компонент TServerSocket не может вызвать такой ошибки.
> Она характерна лишь для TClientSocket.
Клиент сокет тоже присутствует. Он тоже конектится к серверу на удаленной машине и шлет ему текстовое сообщение после чего отключаетсяprocedure TStatusATMThread.ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
{******************************************************}
// Функция определения локального айпи адреса
function GetLocalIP: String;
const WSVer = $101;
var
wsaData: TWSAData;
P: PHostEnt;
Buf: array [0..127] of Char;
begin
Result := "";
if WSAStartup(WSVer, wsaData) = 0 then begin
if GetHostName(@Buf, 128) = 0 then begin
P := GetHostByName(@Buf);
if P <> nil then Result := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
end;
WSACleanup;
end;
end;
{***********************************************************}
begin
if ClientS.Socket.Connected
then
begin
try
ClientS.Socket.SendText(GetLocalIP+":Status");
Finally
ClientS.Socket.Close;
end;
end;
end;
Ошибки OnError обрабатываю так
Socket.Close;
ErrorCode := 0;
Как еще можно обработать эту ошибку ?
← →
Сергей М. © (2006-12-04 13:46) [4]
> begin
> if ClientS.Socket.Connected
Это еще зачем ?
Ты же обрабатываешь событие успешного коннекта, значит Connected в этот момент заведомо равен True !
> ClientS.Socket.SendText(GetLocalIP+":Status");
Каков тайный смысл этого действа ?
Сервер и без этого знает IP-адрес подключившегося хоста.
> Ошибки OnError обрабатываю так
>
> Socket.Close;
> ErrorCode := 0;
>
>
> Как еще можно обработать эту ошибку ?
В целом и общем нормально обрабатываешь.
Значит ошибка в логике за пределами этого кода.
> try
> ClientS.Socket.SendText(GetLocalIP+":Status");
>
> Finally
> ClientS.Socket.Close;
> end;
А вот это вряд ли допустимо.
Вызвав SendText() в асинхронном неблок.режиме ты всего лишь запускаешь операцию передачи, успешное завершение метода SendText при этом не есть признак фактической доставки данных, поэтому вызов Close (закрывающий гнездо) может прервать операцию доставки без ее фактического завершения.
← →
KyRo (2006-12-04 13:56) [5]
> begin
> > if ClientS.Socket.Connected
Тут ты прав это можно убрать
> Это еще зачем ?
> Ты же обрабатываешь событие успешного коннекта, значит Connected
> в этот момент заведомо равен True !
>
>
> > ClientS.Socket.SendText(GetLocalIP+":Status");
Я не знал просто как определить ай пи подключившегося клиента , по этому просто пересылал его вместе с текстом . Подскажите как его определить на сервере?
> > try
> > ClientS.Socket.SendText(GetLocalIP+":Status");
>
> >
> > Finally
> > ClientS.Socket.Close;
> > end;
>
>
> А вот это вряд ли допустимо.
>
> Вызвав SendText() в асинхронном неблок.режиме ты всего лишь
> запускаешь операцию передачи, успешное завершение метода
> SendText при этом не есть признак фактической доставки данных,
> поэтому вызов Close (закрывающий гнездо) может прервать
> операцию доставки без ее фактического завершения.
А как мне узнать что клиент передал сообщение и отключить его что бы быть увереным в том что он передался ?
← →
Сергей М. © (2006-12-04 14:11) [6]
> как его определить на сервере?
Например, в OnClientConnect прочитать зн-е св-ва Socket.RemoteAddr
> как мне узнать что клиент передал сообщение
Способов не мало.
Самый простой из них - твой сервер шлет клиенту подтверждение получения его сообщения, т.н. "квитанцию", и по получении этой "квитанции" клиент со спокойной душой разрывает соединение.
> и отключить его
А зачем это делать клиенту ?
Пусть сервер получив это сообщение сам разрывает соединение, тогда клиенту вообще ничего делать не придется
← →
KyRo (2006-12-04 15:26) [7]
> > и отключить его
>
>
> А зачем это делать клиенту ?
> Пусть сервер получив это сообщение сам разрывает соединение,
> тогда клиенту вообще ничего делать не придется
Тоже вариант буду пробовать.
← →
Сергей М. © (2006-12-04 15:30) [8]Все клиент-серверные "дела" начинаются с разработки и утверждения протокола информационного обмена между клиентом и сервером.
До тех пор пока ты не сделаешь это "дело", все твои потуги обречены на провал.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.048 c