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


Автор: Vlad308011 22.2.2012, 16:47
Есть некий сайт в интернете
Есть програма делающая хттп запросы к нему
У нескольких человек програма получает страницу от сервера через раз, нестабильно
Написал кусок кода в цикле создающий соединение с сервером

Код

    vSocket := Socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
    FillChar(vSockAddr,SizeOf(TSockAddr),0);
    vSockAddr.sin_family := AF_INET;
    vSockAddr.sin_port := htons(FPort);
 
    p := GetHostByName(PChar(FHost));
    if p=nil then
    begin
      Memo1.Lines.Add('Error resolving IP of '+FHost);
      continue;
    end;
    IPAddr:=inet_ntoa(PInAddr(p.h_addr_list^)^);
 
    vSockAddr.sin_addr.S_addr := inet_addr(pchar(IPAddr));
    connect(vSocket,vSockAddr,SizeOf(TSockAddr));
 
    SocketEvent:=WSACreateEvent;
    try
      WSAEventSelect(vSocket,SocketEvent,FD_CLOSE or FD_CONNECT);
      repeat
        if WaitForSingleObject(SocketEvent,30000)=258 then
        begin
          Memo1.Lines.Add('Connection timeouted...');
          break;
        end;
        WSAResetEvent(SocketEvent);
        WSAEnumNetworkEvents(vSocket,SocketEvent,@NI);
        if (NI.lNetworkEvents and FD_CONNECT)<>0 then
        begin
          if NI.iErrorCode[FD_CONNECT_BIT]<>0 Then
          begin
            Memo1.Lines.Add('Error '+IntToStr(NI.iErrorCode[FD_CONNECT_BIT])+' while connecting to '+FHost+' ['+IPAddr+':'+IntToStr(FPort)+']...');
            Break;
          end else
          begin
            Memo1.Lines.Add('Connected to '+FHost+' ['+IPAddr+':'+IntToStr(FPort)+']...');
            SCount:=SCount+1;
            Break;
          end;
        end;
        if (NI.lNetworkEvents and FD_CLOSE)<>0 then
        begin
          closesocket(vSocket);
          vSocket:=INVALID_SOCKET;
          Memo1.Lines.Add('Connection closed by remote server...');
          Break;
        end;
      Until 1=0;
    finally
      WSACloseEvent(SocketEvent);
      closesocket(vSocket);
      vSocket:=INVALID_SOCKET;
    end;


лог работы выглядит примерно так
Connected to ххххххх...
Error 10060 while connecting to ххххххх...
Error 10060 while connecting to ххххххх...
Error 10060 while connecting to ххххххх...
Connected to ххххххх...
Error 10060 while connecting to ххххххх...
Connected to ххххххх...
Error 10060 while connecting to ххххххх...
Connected to ххххххх...
Connected to ххххххх...
Error 10060 while connecting to ххххххх...
Connected to ххххххх...
Error 10060 while connecting to ххххххх...
Connected to ххххххх...
Connected to ххххххх...

при этом в любом браузере на этой же машине эта страничка открывается стабильно
в чем может быть проблемма?

Автор: Gnus 29.2.2012, 10:10
Код

...
   WSAResetEvent(SocketEvent);
   WSAEnumNetworkEvents(vSocket,SocketEvent,@NI);
...


Зачем тут делать сброс события? 
WSAEnumNetworkEvents должна заполнить структуру WSANETWORKEVENTS и сбросить SocketEvent.
А так получается, что ты сбрасываешь событие до заполнения WSANETWORKEVENTS и что у тебя в NI хранится неизвестно.

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