2016-10-12 5 views
0
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(&local, 0, sizeof(local)); 
    local.sin_family = PF_INET; 
    local.sin_port = htons(m_port); 

    int ret = PISocket::Bind(m_debug_socket, (sockaddr*)&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, &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 && 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*)&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; 
} 

私はプログラムに接続するためにリモートプロファイラを使用します。私は自分のPCでこのコードをうまく実行することができますが、どういうわけかiOSでは、TryAcceptは常に0.0.0.0:32772から接続を受け取ります。ログは次のとおりです。予期しないソケット接続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は、initの後のどこかで呼び出されます。

答えて

2

このコードがどのように動作するのかわかりません。 m_gui_socketINVALID_SOCKETと等しくない限り、SocketDebugger::TryAcceptは無条件で「プロファイラ接続」を印刷し、初期化されていないsockaddr_inの内容を表示します。実際に受け入れ操作を実行するものはありません。

+0

申し訳ありませんが、私は質問を更新しました。 'TryAccept'はtick関数内でelseと呼ばれ、最初に接続されたアドレスはいつものように' 0.0.0.0:32772'です。 – zoujyjs

+0

おそらく 'PISocket :: Accept'(またはそれがどのように使用されているか)に問題がありますが、サンプルコードにそれを含めていないので、デバッグできません。 – duskwuff