Неожиданное подключение к сокету из 0.0.0.0: 32772

#c #sockets #network-programming

#c #сокеты #сетевое программирование

Вопрос:

 int SocketDebugger::Init(unsigned short p)
{
    if (m_state != dsDisconnect)
    {
        return 0;
    }

    if (PISocket::Startup()) 
    {
        return -1;
    }

    m_port = p;
    m_debug_socket = PISocket::Socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
    if (m_debug_socket == INVALID_SOCKET) 
    {
        Log(LEVEL_PYDEBUGGER, "GetLastError: %d", PISocket::Errno());
        return -2;
    }

    sockaddr_in local;
    memset(amp;local, 0, sizeof(local));
    local.sin_family = PF_INET;
    local.sin_port = htons(m_port);

    int ret = PISocket::Bind(m_debug_socket, (sockaddr*)amp;local);
    if (ret == SOCKET_ERROR)
    {
        PISocket::Close(m_debug_socket);
        m_debug_socket = INVALID_SOCKET;
        return -3;
    }

    ret = PISocket::Listen(m_debug_socket, 0);
    if (ret == SOCKET_ERROR)
    {
        PISocket::Close(m_debug_socket);
        m_debug_socket = INVALID_SOCKET;
        return -4;
    }

    unsigned long nonblocking = 1;
    ret = PISocket::Ioctl(m_debug_socket, FIONBIO, amp;nonblocking);
    if (ret == SOCKET_ERROR)
    {
        PISocket::Close(m_debug_socket);
        m_debug_socket = INVALID_SOCKET;
        return -5;
    }

    m_state = dsListen;


    unsigned long t = (unsigned long)PITime()   2000;

    do 
    {
        TryAccept();
    }

    while ((unsigned long)PITime() < t amp;amp; m_state == dsListen);
    LogInfo("profiler socket init port: %d", port)
    return 0;
}

bool SocketDebugger::TryAccept()
{
    sockaddr_in local;
    //int len = sizeof(local);
    // set non blocking...  

    m_gui_socket = PISocket::Accept(m_debug_socket, (sockaddr*)amp;local);

    if (m_gui_socket == INVALID_SOCKET) 
    {       
        if (PISocket::Errno() == EWOULDBLOCK)
        {   
            return false;
        }
    }

    LogInfo("profiler connected! %s:%d", inet_ntoa(local.sin_addr), local.sin_port);
    m_state = dsConnect;
    m_send_stream.clear();
    m_recv_stream.clear();
    return true;
}
  

Я использую удаленный профилировщик для подключения к моей программе. Я могу хорошо запустить этот код на своем ПК, но каким-то образом в ios TryAccept всегда получает соединение 0.0.0.0:32772 . Журнал:

 5   [23:43:04.368]   [UTILS] [INFO] profiler connected! 0.0.0.0:32772
6   [23:43:04.368]   [UTILS] [INFO] profiler socket init port: 7776, 0
  

Почему? ps: TryAccept также будет вызываться в другом месте после инициализации

Ответ №1:

Я не вижу, как этот код когда-либо работал где-либо. До тех пор, пока m_gui_socket не равно INVALID_SOCKET , SocketDebugger::TryAccept будет безоговорочно печатать «подключенный профилировщик» и отображать содержимое неинициализированного sockaddr_in . Там нет ничего, что на самом деле выполняет операцию accept!

Комментарии:

1. Извините, я обновил вопрос. В TryAccept функции tick будет вызываться else where, а первый подключенный адрес будет 0.0.0.0:32772 таким же, как всегда.

2. Вероятно, что-то не так PISocket::Accept (или в том, как оно используется), но вы не включили это в свой пример кода, поэтому я не могу это отладить.