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


Автор: Delphins 29.8.2005, 20:22
Код

var
  WsaD: WsaData;
  Sock: TSocket;
  ClientService: sockaddr_in;
  SendBuf: PChar;
  RecvBuf: PChar;
begin
  { Кнопка "Тест". }
  LoadProtocol( Cb_Protocol.ItemIndex ); // Загрузить команды.
  if WSAStartup( MAKEWORD( 2,2 ), WsaD ) <> 0 then
  begin
    Sock := Socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
    if Sock = INVALID_SOCKET then
      MessageBox( Handle, PChar( Format( 'WSA error in Socket()! Error %d !',
        [ WSAGetLastError( ) ] ) ), 'Error!', MB_ICONERROR ) else
    begin
      { Когда сокет уже инициализирован. }
      with ClientService do
      begin
        sin_family := AF_INET;
        sin_addr.S_addr := inet_addr( pChar( e_IP.Text ) );
        sin_port := htons( e_Port.Value );
      end;
      if connect( Sock, ClientService, SizeOf( ClientService ) ) = SOCKET_ERROR then
      begin
        MessageBox( Handle, PChar( Format( 'WSA error in Connect()! Error %d !',
          [ WSAGetLastError( ) ] ) ), 'Error!', MB_ICONERROR );
        WSACleanup( );
      end else
      begin
        // Вот тут уже все готово. Теперь действуем...
        //BSent := send( sock, SendBuf, StrLen( SendBuf ), 0 );
        BRecv := SOCKET_ERROR;
        while BRecv = SOCKET_ERROR do
        begin
          // Принимаем.
          BRecv := recv( Sock, RecvBuf, 1024, 0 );
          if ( BRecv = 0 ) or ( BRecv = WSAECONNRESET ) then
          begin
            MessageBox( Handle, PChar( Format( 'WSA error, connection reset! Error %d !',
              [ WSAGetLastError( ) ] ) ), 'Error!', MB_ICONERROR );
            Break;
            Exit;
          end;
        end;
        if BRecv > 0 then
          if RecvBuf = Cmd.s_r_Hello then
          begin
            // Строка на соеденение принята.
            // Отправим команду получения справки.
            SendBuf := PChar( Cmd.s_c_CmdAbout );
            BRecv := Send( sock, SendBuf, StrLen( SendBuf ), 0 );
            BRecv := SOCKET_ERROR;
            RecvBuf := nil;
            while BRecv = SOCKET_ERROR do
            begin
              // Принимаем строку с текстом о вирусе.
              BRecv := recv( Sock, RecvBuf, 1024, 0 );
              if ( BRecv = 0 ) or ( BRecv = WSAECONNRESET ) then
              begin
                MessageBox( Handle, PChar( Format( 'WSA error, connection reset! Error %d !',
                  [ WSAGetLastError( ) ] ) ), 'Error!', MB_ICONERROR );
                Break;
                Exit;
              end;
              // Вывести строку.
              Memo.Lines.Clear;
              Memo.Lines.Add( RecvBuf );
              MessageBox( Handle, 'Test ok!' + #13#10 + 'Look at memo. You can see version information.', 'All ok!', MB_ICONINFORMATION );
            end;
          end;
      end;
    end;
  end else
    MessageBox( Handle, PChar( Format( 'WSA error in WSAStartUp()! Error %d !',
      [ WSAGetLastError( ) ] ) ), 'Error!', MB_ICONERROR );


Выводит ошибку на WSAStartUp.
Признаюсь глядел в MSDN smile
У кого есть могуть глянуть по ссылке: ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.WIN32COM.v10.en/winsock/winsock/getting_started_with_winsock.htm
( Именно установленный ).
Что нетак немогу понять.... Вроде как там написал.

Автор: Гость_Raider 29.8.2005, 23:32
Незнаю в чём причина, попробуй вместо MAKEWORD( 2,2 ), MAKEWORD( 2,0 ) .
----
Ошибки ? smile
1) WsaData ---> TWsaData.
2) connect( Sock, ClientService, SizeOf( ClientService ) ) ---> connect( Sock, @ClientService, SizeOf( ClientService ) )

Пока Я их не исправил у меня не компилилось, использовал WinSock2.

Автор: Delphins 30.8.2005, 00:37
Все просто надо было WsaStartUp( $0202, WsaD ); smile

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