reсv + send timeout, обработка

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Spy2ex, 27 Sep 2010.

  1. Spy2ex

    Spy2ex Elder - Старейшина

    Joined:
    20 Sep 2008
    Messages:
    32
    Likes Received:
    15
    Reputations:
    1
    Такая проблема нужно корректно обработать send + recv таймаут
    Code:
     
    объявлн. сткрутр, сокетов
    коннектимся, все удачно
    
    // теперь нужно чекнуть 2 вида проксей http и sock5 с таймаутами на ресив и сенд
    
    check_HTTP_proxy (my_sock, 5,5);
    здесь должна быть функция проверки socks5 с этим же сокетом, но будет ли она исполнятся зависит от ответа предыдущ. функции
    
    Code:
    nt check_HTTP_proxy (SOCKET sock, int recv_timeout, int send_timeout)  // sec....
    {
        DWORD recv_timeout = 5*1000; // sec
        DWORD send_timeout = 5*1000; // sec
    	
        setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&recv_timeout, sizeof(DWORD));
    	setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&send_timeout, sizeof(DWORD));
         
       char recv_buffer[1024];
       char req_buff[]=
       "POST http://domain.com/upload.php HTTP/1.0 \r\n"
       "Host: domian.com\r\n"
       "User-Agent: Mozilla/5.0\r\n"
       "Content-Type: application/x-www-form-urlencoded\r\n"
       "Connection: Close\r\n"
    
       "post_data=someverylongrequeststring\r\n";
      
      int send_res = send(sock, req_buff, strlen(req_buff), 0);
      if((send_res == SOCKET_ERROR) && (WSAGetLastError()==WSAETIMEDOUT))
      {
      	closesocket(sock); // для себя
    	return **; // таймаут send 
      }
      else
      {
    	  int recv_res = recv (sock,recv_buffer, 1024, 0);
    	  if((recv_res==SOCET_ERROR) && (WSAGetLastError()==WSAETIMEDOUT))
    	  {
    	  	 return **; // таймаут ресив, как бы должен закрыть сокет, но можно и не закрывать в функции
    	  }
    	  else
    	  {
    	  	// все нормально
    	  }	
    	  
      }			
    }
    
    Не сильно ли я жестко обрабатываю таймауты и стоит вообще ставить таймаут на send ?
    p/s только реализация функции http чека.
     
    #1 Spy2ex, 27 Sep 2010
    Last edited: 28 Sep 2010
  2. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Между делом, таймауты даже выставлены неправильно. В обоих вызовах setsockopt следует передавать не структуру timeval, а просто DWORD и, соответственно, sizeof(DWORD).
     
  3. Spy2ex

    Spy2ex Elder - Старейшина

    Joined:
    20 Sep 2008
    Messages:
    32
    Likes Received:
    15
    Reputations:
    1
    Поправил, спасибо.


    p.s не жестко я обрабатв. таймауты и когда вообще нужно таймаут на сенд ?
     
  4. NemeZz

    NemeZz Elder - Старейшина

    Joined:
    20 Aug 2008
    Messages:
    102
    Likes Received:
    67
    Reputations:
    3