C++: невозможно подключиться к сокету сервера (linux)

Dears,

У меня есть основная программа, которая выполняет дочерний процесс и пытается подключиться к этому дочернему процессу через сокет. Это соединение работает правильно. Но при обнаружении ошибки основная программа пытается правильно закрыть соединение с сокетом, затем она убивает дочерний процесс, перезапускает новый и пытается подключиться к новому дочернему процессу.

Переподключение может работать несколько сотен раз. Но, если я повторю это сотни раз после определенного количества циклов, моя основная программа больше не сможет подключаться к дочернему процессу.

Я не знаю, что здесь есть ссылка, но при попытке правильно закрыть сокет моя основная программа иногда получает SIGPIPE. Я игнорирую это и продолжаю обработку. Но я заметил, что когда программа больше не принимает соединения, она всегда получает 10 SIGPIPES. Я пробовал несколько раз, и это всегда заканчивается в 10.

Любая идея?

С уважением, Брайс

ИЗДАНО:

Вот код, который закрывает соединение:

int BAE_nb_sigpipes_received = 0;
void enmx_close( ENMX_HANDLE conn )
{
    sConnectionInfo         **connInfo, *temp;
    SOCKET_CMD_HEAD         cmd_head;
    time_t           secs;
    pth_event_t             ev_wakeup;

    temp = NULL;
    for( connInfo = &enmx_connections; *connInfo != NULL; connInfo = &(*connInfo)->next ) {
        if( (*connInfo)->socket == conn ) {
            temp = *connInfo;
            *connInfo = (*connInfo)->next;
            break;
        }
    }

    if( temp != NULL ) {
        cmd_head.cmd = SOCKET_CMD_EXIT;
        cmd_head.address = 0xffff;
        secs = time( NULL ) + TIMEOUT;
        switch( temp->mode ) {
            case ENMX_MODE_STANDARD:
               while( write( conn, &cmd_head, sizeof( cmd_head )) == -1 )
                {
                    if( errno == EAGAIN ) {
                        if( secs <= time( NULL )) {
                            break;
                        }
                        usleep( 10 * 1000 );
                        continue;
                    }
                    /* BAE : if we encounter a sigpipe, the client stupidly continues to try to write to scoket, which never ends...*/
                    else if (errno == EPIPE)
                    {
                       BAE_nb_sigpipes_received++;
                       break;
                    }
                }
                break;
            case ENMX_MODE_PTH:
                ev_wakeup = pth_event( PTH_EVENT_TIME, pth_time( secs, 0 ));
                pth_write_ev( conn, &cmd_head, sizeof( cmd_head ), ev_wakeup );
                // either the request has been sent or timeout reached
                // in any case, we've finished
                pth_event_free( ev_wakeup, PTH_FREE_ALL );
                break;
        }
        if( temp->hostname ) free( temp->hostname );
        if( temp->name ) free( temp->name );
        free( temp );
    }

    close( conn );
}

`

И вот код, который открывает его: `

    if( connect( sock_con, (struct sockaddr *)&server, sizeof( struct sockaddr_in )) != 0 ) {
       printf("ENMX_E_SERVER_NOTRUNNING (%s)\n", myname);
       return( ENMX_E_SERVER_NOTRUNNING );
    }

`

Код, который убивает дочерний процесс, выглядит следующим образом:

wxProcess::Kill(eibnetmux_process_pid, wxSIGKILL);

`

0 ответов

Другие вопросы по тегам