Как определить, используется ли порт на стороне сервера (в C ++ для Windows)? - PullRequest
0 голосов
/ 10 января 2019

Это, конечно, распространенный вопрос, но не в этом смысле (окна, на стороне сервера, принять несколько соединений).

Моя цель - разрешить запуск списка серверов на порту для нескольких подключений, только если до этого порт был обнаружен как «неиспользуемый».

В строке, где я ставлю //HERE..., bind не возвращает статус SOCKET_ERROR, как я ожидал. Может я что-то не так делаю.

Как определить, что мой порт не используется каким-либо другим приложением?

Вот состояние порта перед запуском (он используется)

netstat -an
  TCP    127.0.0.1:2005         0.0.0.0:0              LISTENING

Надеюсь, этого фрагмента достаточно, чтобы объяснить, что я делаю, это объединение нескольких шагов.

WSADATA WSAData;
int err = WSAStartup(MAKEWORD(2, 2), &WSAData);

SOCKADDR_IN sin;
socklen_t recsize = sizeof(sin);
int one = 1;

SOCKADDR_IN* csin;
SOCKET csock = INVALID_SOCKET;
socklen_t crecsize = sizeof(SOCKADDR_IN);
int sock_err;

if (m_socket != INVALID_SOCKET)
{
    memset(&sin, 0, recsize);
    if(m_blocal)
        sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);   
    else
        sin.sin_addr.s_addr = htonl(INADDR_ANY);

    sin.sin_family = AF_INET;                       
    sin.sin_port = htons(m_iPort);

    setsockopt(m_socket, SOL_SOCKET, SO_REUSEADDR, (const char*)&one, sizeof(int));
    sock_err = bind(m_socket, (SOCKADDR*)&sin, recsize);
    //HERE I want to be sure no one else runs on this port

    //rest of the code using: select(m_socket + 1, &rd, &wr, &er, &timeout);
}

closesocket(m_socket);
WSACleanup();

1 Ответ

0 голосов
/ 10 января 2019

Не задано SO_REUSEADDR. Тогда bind() потерпит неудачу, если адрес уже используется, а WSAGetLastError() вернет WSAEADDRINUSE.

Также обратите внимание, что два процессора могут по-прежнему связываться с одним и тем же портом, если IP-адреса различаются, например, одна привязка процесса к localhost и другая привязка процесса к сетевому адресу локальной сети.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...