#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
(или в том, как оно используется), но вы не включили это в свой пример кода, поэтому я не могу это отладить.