Я пишу программу с использованием Winsock API, потому что мой друг хотел, чтобы простая программа проверила и проверила, работает ли сервер Minecraft или нет. Он работает нормально, если он работает, однако, если он не работает, программа зависает до тех пор, пока, я предполагаю, не истечет время ожидания соединения. Другая проблема, если у меня есть что-то вроде этого (псевдокод):
void connectButtonClicked()
{
setLabel1Text("Connecting");
attemptConnection();
setLabel1Text("Done Connecting!");
}
похоже, что пропускает право на попыткуConnection (), полностью игнорируя то, что находится над ним. Я замечаю это, потому что программа зависнет, но она не изменит метку на «Соединение».
Вот мой фактический код подключения:
bool CConnectionManager::ConnectToIp(String^ ipaddr)
{
if(!m_bValid)
return false;
const char* ip = StringToPConstChar(ipaddr);
m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(isalpha(ip[0]))
{
ip = getIPFromAddress(ipaddr);
}
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr(ip);
service.sin_port = htons(MINECRAFT_PORT);
if(m_socket == NULL)
{
return false;
}
if (connect(m_socket, (SOCKADDR*)&service, sizeof(service)) == SOCKET_ERROR)
{
closesocket(m_socket);
return false;
}
else
{
closesocket(m_socket);
return true;
}
return true;
}
В конструкторе CConnectionManager также есть код для запуска Winsock API и тому подобное.
Итак, как мне избежать этого зависания и разрешить мне обновлять что-то вроде индикатора выполнения во время соединения? Должен ли я сделать соединение в отдельном потоке? Я работал только с потоками в Java, поэтому понятия не имею, как это сделать: /
Также: я использую приложение Windows Form CLR
Я использую Microsoft Visual C ++ 2008 Express Edition