Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.074 c
4-1155593723
Sergey_FV
2006-08-15 02:15
2006.12.24
Quick Launch под NT


15-1164739376
lolool
2006-11-28 21:42
2006.12.24
linux +kylix


15-1164874133
кви
2006-11-30 11:08
2006.12.24
с++


15-1165225093
Krants
2006-12-04 12:38
2006.12.24
Относительное время выполнения алгоритма


2-1164971636
mavrtuva
2006-12-01 14:13
2006.12.24
lookup компоненты





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский