Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Socket Error 10038


Gek1 ©   (2005-04-18 15:10:00) 

Ктото может разьяснить что ето за ошибка?
И где можно взять описание всех socket ошибок?


Gek1   (2005-04-19 13:20:00) [1]

спасибо. :-)


Digitman   (2005-04-19 12:55:00) [2]

см. http://book.itep.ru, раздел Winsock
там все тебя интересующее достаточно подробно описано и разжевано


Gek1   (2005-04-19 12:45:00) [3]

if ErrorCode <> 0 then
          raise ESocketError.CreateResFmt(@sWindowsSocketError,
            [SysErrorMessage(ErrorCode), ErrorCode, 'recv']);

получается если я после обработчика не установлю ErrorCode:=0, то выползет окно с ошибкой.

if ErrorCode <> WSAEWOULDBLOCK then
Если ошибка равна WSAEWOULDBLOCК, то он не считает за ошибку? А что это за тип таких ошибок?

И в случае если я рву связь - какой вариант предпочителен для моего случая? Вариант А или Б?


> обработка ошибки вовсе не обязательно ведет за собой разрыв
> коннекта по инициативе обработчика ошибки

Судя по коду - дисконнект произойдет сам не зависимо от того хочу я или нет. и мне дисконнект делать уже нет необходимости?

Что-то я слегка запутался. Кто-то может мне помочь расставить все по полочкам?


Digitman   (2005-04-19 12:27:00) [4]

function TCustomWinSocket.ReceiveBuf(var Buf; Count: Integer): Integer;
var
 ErrorCode: Integer;
begin
 Lock;
 try
   Result := 0;
   if (Count = -1) and FConnected then
     ioctlsocket(FSocket, FIONREAD, Longint(Result))
   else begin
     if not FConnected then Exit;
     Result := recv(FSocket, Buf, Count, 0);
     if Result = SOCKET_ERROR then
     begin
       ErrorCode := WSAGetLastError;
       if ErrorCode <> WSAEWOULDBLOCK then
       begin
         Error(Self, eeReceive, ErrorCode);
         Disconnect(FSocket);
         if ErrorCode <> 0 then
           raise ESocketError.CreateResFmt(@sWindowsSocketError,
             [SysErrorMessage(ErrorCode), ErrorCode, 'recv']);
       end;
     end;
   end;
 finally
   Unlock;
 end;
end;


Gek1   (2005-04-19 12:15:00) [5]

Может ктото выложить этот файл в интернете? например на http://www.webfile.ru/...
Охота посмотреть, но у меня D2005 и его там нету.


Digitman   (2005-04-18 17:44:00) [6]


> Gek1   (18.04.05 17:28) [8]


не посмотреть ли тебе соотв. реализацию в модуле scktcomp.pas ?
в нем все это сделано крайне грамотно и крайне корректно ..


Gek1   (2005-04-18 17:28:00) [7]


> Digitman ©   (18.04.05 17:19) [7]

После каких ошибок необходимо рвать связь и после каких нет необходимости?

Как правильно построить логику обработчика?


Digitman   (2005-04-18 17:19:00) [8]


> после обработки ошибки


обработка ошибки вовсе не обязательно ведет за собой разрыв коннекта по инициативе обработчика ошибки

все зависит от логики обработчика


Gek1   (2005-04-18 17:12:00) [9]

Еще такой вопрос:

Есть у меня GameSocket - указатель на TClientSocket:
В случае если я ловлю ошибку а после обработки ошибки я хочу заново установить связь - как правильно делать:

Вариант а:
Просто GameSocket.Disconnect и потом GameSocket.Connect

Вариант б:
GameSocket.Disconect;
GameSocket.Free;
GameSocket := TSocketClient.Create(nil);
GameSocket.Connect;

Подразумевается что:
1. я обработаю ошибку и установлю ErrorCode := 0;
2. метод Connect будет выполнятся в блоке try ... except.

Так какой вариант правильнее?
(Если третий - то прозьба код и коментарии)


Digitman   (2005-04-18 16:15:00) [10]

полный список winsock-отказов тебе ничего не даст
нужно четко понимать, какие конкретно отказы ассоциированы с тем или иным ВинСок-вызовом

впрочем "краткий список" для Winsock 1.1 Борланд тебе предоставил - модуль Winsock.pas, искать по ключ.слову "baseerr"


Gek1   (2005-04-18 16:05:00) [11]

А кто мне скажет в чем причина может быть? В программе или в соединении?


easy   (2005-04-18 15:59:00) [12]

showmessage(syserrormessage(10061));


Gek1   (2005-04-18 15:45:00) [13]

Хорошо .. а 10057 ... 10061 ?
Причина может быть в качестве связи или в программе?


Digitman   (2005-04-18 15:32:00) [14]

значение параметра типа хэндл гнезда не являет собой значение хэндла реально существующего гнезда


Наверх

Титульная страница Поиск, карта сайта Написать письмо