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

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];
      
    memset( szSendData, 0, sizeof(szSendData) );

      
    char szRecvData[1024];
      
    memset( szRecvData, 0, sizeof(szRecvData) );

      
    sockaddr_in saddr;
      
    sockaddr_in claddr;

      
    servsock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

      
    memset( &saddr, 0, sizeof(sockaddr_in) );

      
    CString szWorkedPort;
      
    pDialog->m_rules->m_workport.GetWindowText( szWorkedPort );

      
    saddr.sin_family = AF_INET;
      
    saddr.sin_port = htons( atoi( szWorkedPort.GetBuffer() ) );
      
    saddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

      
    bind( servsock, (sockaddr *)&saddr, sizeof(sockaddr_in) );

      
    int cllen = sizeof(sockaddr_in);

      
    g_startworked = GetCurrentTime2();

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

        
    memset( szRecvData, 0, sizeof(szRecvData) );
        
    int packlen = recvfrom(servsock, szRecvData, sizeof(szRecvData), 0, (sockaddr *)&claddr, &cllen);

        if( 
    packlen != -1 )
        {
          
    //Тут код для работы с пакетами, разные условия и т.д.
          
    char pEndData[512];
          
    memset( pEndData, 0, sizeof(pEndData) );
          
    memcpy( pEndData, pHeader, sizeof(pHeader) );
          
    memcpy( pEndData + sizeof(pHeader), pCommand, sizeof(pCommand) );
          
    sendto( servsock, pEndData, 8 + strlen(pCommand), 0, (struct sockaddr *)&claddr, cllen);
        }
      }

      
    closesocket( servsock );
    Подскажите, в чем может быть проблема.
     
  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 Прочитай книжку о сетевом программировании (полезные ссылки я давал в статье на хабре)
     
    _________________________