Конференция "Сети" » Ошибка 10035 при запросе на HTTP сервер через WinSock [D7, WinXP]
 
  • Редиска (27.01.18 17:51) [0]
    Добрый день имеется вот такой код.
    Проверка на открытый порт происходит успешно, а когда надо получить ответ то WinSock возвращает ошибку 10035.
    Вообще задача получить не всю страницу, а достаточно только Headers.
    В первую очередь важна скорость.


    function TCheckerThread.CheckPort: Boolean;
    var
     s, opt, BytesRead: Integer;
     FSocket: TSOCKET;
     addr: TSockAddr;
     hEvent: THandle;
     fset: TFDset;
     tv: TTimeval;
     Get, Response: string;
    begin
     Result := false;

     addr.sin_family := AF_INET;
     addr.sin_addr.s_addr := INADDR_ANY;

     addr.sin_addr := IP;

     hEvent := WSACreateEvent();
     FSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);

     try
       if (FSocket = INVALID_SOCKET) then
       begin
         Result := True;
         Exit;
       end;

       WSAEventSelect(FSocket, hEvent, FD_WRITE + FD_CONNECT);

       addr.sin_port := Port;

       connect(FSocket, @addr, sizeof(addr));

       if (WSAGetLastError() = WSAEINPROGRESS) then
       begin
         Result := true;
         Exit;
       end;

       FD_Zero(fset);
       FD_SET(FSocket, fset);

       tv.tv_sec := 1;
       tv.tv_usec := 0;

       s := select(1, nil, @fset, nil, @tv);

       if (not FD_ISSET(FSocket, fset)) then
       begin
         Result := true;
         Exit;
       end;

       s := Sizeof(opt);
       opt := 1;

       getsockopt(FSocket, SOL_SOCKET, SO_ERROR, @opt, s);

       if (opt <> 0) then
       begin
         Result := true;
         Exit;
       end;

    ToDebug('Port opened');

       Get := Format('GET / HTTP/1.1'#13#10 + 'Host: %s'#13#10 + 'User-Agent: %s'#13#10 + 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'#13#10 + 'Accept-Language: en-US,en;q=0.5'#13#10 + 'Accept-Encoding: gzip, deflate'#13#10 + 'Connection: keep-alive'#13#10 + #13#10, [IpStr, 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0']);

       if Send(FSocket, PChar(Get)^, Length(Get), 0) = SOCKET_ERROR then
       begin
         Result := True;
         Exit;
       end;

       SetLength(Response, 65536);
       BytesRead := Recv(FSocket, PChar(Response)^, 65536, 0);

       case BytesRead of
         -1:
           ToDebug('Recv error: ' + IntToStr(WSAGetLastError));
         0:
           ToDebug('Connection closed by peer');
       else
         Response[BytesRead] := #0;
         ToDebug('Response: ' + Response);
       end;

     finally
       if closesocket(FSocket) <> 0 then
         ToDebug('Error closed socket');
       WSACloseEvent(hEvent);
     end;
    end;

  • Styx © (28.01.18 01:34) [1]
    Так не успел сервер так быстро ответить...

    This error is returned from operations on nonblocking sockets that cannot be completed immediately, for example recv when no data is queued to be read from the socket. It is a nonfatal error, and the operation should be retried later. It is normal for WSAEWOULDBLOCK to be reported as the result from calling connect on a nonblocking SOCK_STREAM socket, since some time must elapse for the connection to be established.
 
Конференция "Сети" » Ошибка 10035 при запросе на HTTP сервер через WinSock [D7, WinXP]
Есть новые Нет новых   [118240   +21][b:0][p:0.002]