Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Оишбка при WSASocket().


Автор: Delphins 17.9.2005, 22:48
Вот мой код: (Вырезал кусочек)

Код

Var
  wsAd: WSAData;
  sin: sockaddr_in;
  ClassName, AppName: PChar;
Begin
  Try
    Try
     // Initialize socket.
      If WSAStartup( c_SocketsVersionHEX, wsAd ) <> 0 Then
      Begin
        // Return socket error.
        OnError( 'WinSock Error! Error # ' + IntToStr( WSAGetLastError ) );
        WSACleanup( ); // Cleanup WSA.
        Exit; // Exit.
      End
      Else
      Begin
        { Working with socket }
        Sock := WSASocketA( PF_INET, SOCK_STREAM, IPPROTO_TCP, Nil, 0, 0 ); // Create TCP sock.
        // TODO: Gere abstract error.!
        If Sock = INVALID_SOCKET Then
          OnError( 'WinSock Error! Error - Invalid Socket!' )
        Else
        Begin
          // Socket already exists.
          ClassName := 'TExForm';
          AppName := 'ExForm';
          //----- Create window
          Handle := CreateWindowEx( 0, ClassName, AppName, WS_DISABLED, 10, 120, 90, 20, 0, 0, 0, Nil );
          ShowWindow( Handle, SW_HIDE );
          UpdateWindow( Handle );
          //----- Working with socket.
          WSAAsyncSelect( Sock, Handle, WM_SOCKET, FD_ACCEPT + FD_READ + FD_CLOSE ); // On read/write message to we's window.
          sin.sin_family := AF_INET; // Sock type = INET.
          sin.sin_port := htons( s_ListenPort ); // Port
          bind( sock, sin, SizeOf( sin ) ); // Bind socket.
          listen( sock, 1 );  // And listen.
          //-------------------------------------------------------------------------
          // Good. Socket listening and binded.
        End;
      End;
    Except
      Result := False;
      DebugLog( 'OpenBackdoor error !' );
    End
  Finally
    Result := True;
  End


WsaSocketA(); Определен как:
Код

Function WSASocketA( af, wType, protocol: integer; lpProtocolInfo: Pointer;
  g, dwFlags: dword ): integer; Stdcall; External 'ws2_32.dll';


OnError(); - Обработчик ошибок.
DebugLog(); - Тоже.

Ошибка возникает на WSASocketA(); Написано "Abstract Error". Почему? smile

Автор: <Spawn> 18.9.2005, 01:35
А этот код откудова? Не из конструктора класса случаем? А то по ошибке похоже, что ты пытаешься создать экземпляр абстактного класса.

Автор: Delphins 18.9.2005, 13:16
Кого? Я этот сам писал. Подклядывая в MSDN.
А WSASocketA() взял из одной проги.

Автор: p0s0l 18.9.2005, 22:35
Цитата(Delphins @ 17.9.2005, 22:48)
Написано "Abstract Error". Почему?
Я немного не понял, кто ошибку пишет и где ?
WSAGetLastError какое значение возвращает ?

Автор: Delphins 18.9.2005, 22:45
Пишет отладчик.
WSAGetLastError вообще ничего не выводит после этого.

Автор: p0s0l 18.9.2005, 23:06
Попробуй отключить
Tools->Debugger Options->Language Exceptions->Stop On Delphi Exceptions

Автор: Delphins 21.9.2005, 20:08
Хех. Нафига отключать отладку?????
Я спрашиваю почему ошибка а не как перестать её ловить!

Автор: p0s0l 21.9.2005, 22:36
Цитата(Delphins @ 21.9.2005, 20:08)
Хех. Нафига отключать отладку?????
Я спрашиваю почему ошибка а не как перестать её ловить!
Не знаю smile, это тебя надо спросить, почему на Sock := WSASocket происходит исключение... Тут экстрасенсов мало, быстрее ответа добьешься, если приведешь больше кода или даже весь код...
Например, может ты забыл сказать, что, к примеру, весь этот код находится в классе, а Sock - это свойство класса (с хитроумным кодом установки значения, типа raise EAbstractError.Create('Abstract Error') smile ) ?
При всём этом не понятен смысл двух Try'ев - ведь ты же не ожидаешь в этом коде исключений, зачем они ?... Сами API функции не генерят исключений (не считая AV, которые в нормальных условиях не должны возникать), остаётся вариант что ты где-то тут спрятал поднятие исключений... Правда в том что ты привел я этого не вижу...
И даже если ожидаешь исключение, то вот это очень оригинальный подход к делу:
Код
  Finally    
    Result := True;    
  End
smile
("пофиг, нормально сокет создался или нет, возвратим True всё равно!" smile )

Цитата(Delphins @ 18.9.2005, 22:45)
WSAGetLastError вообще ничего не выводит после этого.
Это как это ? Ноль что ли возвращает ?

Автор: Delphins 22.9.2005, 16:07
Хех. Уже все решилось. Перемсотрел весь код и изменил кое-что. Нет это было не в классе.
Поменял sockaddr_in на TSockaddr_in и WsaData на TWSAData;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)