Сервер перестает отвечать.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by fire64, 6 Apr 2013.

  1. fire64

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

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    После 6-7 часов нормальной работы, клиенты просто перестают соединяться с сервером.
    Помогает только пересоздание сокетов :(

    PHP:
      char szSendData[1024];
      
    memsetszSendData0sizeof(szSendData) );

      
    char szRecvData[1024];
      
    memsetszRecvData0sizeof(szRecvData) );

      
    sockaddr_in saddr;
      
    sockaddr_in claddr;

      
    servsock socket(AF_INETSOCK_DGRAMIPPROTO_UDP);

      
    memset( &saddr0sizeof(sockaddr_in) );

      
    CString szWorkedPort;
      
    pDialog->m_rules->m_workport.GetWindowTextszWorkedPort );

      
    saddr.sin_family AF_INET;
      
    saddr.sin_port htonsatoiszWorkedPort.GetBuffer() ) );
      
    saddr.sin_addr.S_un.S_addr htonl(INADDR_ANY);

      
    bindservsock, (sockaddr *)&saddrsizeof(sockaddr_in) );

      
    int cllen sizeof(sockaddr_in);

      
    g_startworked GetCurrentTime2();

      while( 
    true )
      {
        if(!
    isworked)
        {
          
    closesocketservsock );
          return 
    0;
        }

        
    memsetszRecvData0sizeof(szRecvData) );
        
    int packlen recvfrom(servsockszRecvDatasizeof(szRecvData), 0, (sockaddr *)&claddr, &cllen);

        if( 
    packlen != -)
        {
          
    //Тут код для работы с пакетами, разные условия и т.д.
          
    char pEndData[512];
          
    memsetpEndData0sizeof(pEndData) );
          
    memcpypEndDatapHeadersizeof(pHeader) );
          
    memcpypEndData sizeof(pHeader), pCommandsizeof(pCommand) );
          
    sendtoservsockpEndDatastrlen(pCommand), 0, (struct sockaddr *)&claddrcllen);
        }
      }

      
    closesocketservsock );
    Подскажите, в чем может быть проблема.
     
  2. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    что за переменная isworked ?

    Ситуации могут быть разные - например. При передачи или приеме данных отвалился килент (обрыв связи) - иии твой сервер повис (так как использует блокирующие сокеты).

    Советы:
    1. Используй SO_KEEPALIVE
    2. Проверяй передачу и прием данных (возможно не все данные передалисл или получились потому что произошло что-то) тобишь проверяй что возвращают функции приема и передачи.

    Почитай тут я описывал кое-что базовое http://habrahabr.ru/post/136041/

    3. Либо сервер пиши на основе epoll (http://stackoverflow.com/questions/67082/what-is-the-best-epoll-kqueue-select-equvalient-on-windows) либо обрабатывай каждого клиента в отдельном потоке - тогда не будет проблем с возможным зависанием.

    4 Прочитай книжку о сетевом программировании (полезные ссылки я давал в статье на хабре)
     
    _________________________