Это, конечно, распространенный вопрос, но не в этом смысле (окна, на стороне сервера, принять несколько соединений).
Моя цель - разрешить запуск списка серверов на порту для нескольких подключений, только если до этого порт был обнаружен как «неиспользуемый».
В строке, где я ставлю //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();