Не могу подключиться к работе

Я работаю над некоторым сетевым кодом. У меня есть 2 решения на моей машине. Первый — это мой сервер, а другой — мой клиент. Я использую C ++ и winsock для сетевого решения.

Вот мой код сервера (настройка).

addrinfo        hints;
addrinfo*       pAddrInfo;
char            pIPAddress[INET6_ADDRSTRLEN];
char            pPortFinal[128];
unsigned long   tempUL;
int             error;

memset(&hints, 0, sizeof hints); // make sure the struct is empty
hints.ai_family = AF_UNSPEC;//AF_INET;     // don't care IPv4 or IPv6
hints.ai_socktype = type;
hints.ai_flags = AI_PASSIVE;     // fill in my IP for me

error = getaddrinfo(NULL/*"localhost"*/, pPort, &hints, &pAddrInfo);
if(error != 0)
{
GetWinSockError(error);
return;
}

for(pAddrInfo = pAddrInfo; pAddrInfo != NULL; pAddrInfo = pAddrInfo->ai_next)
{
this->m_Socket = socket(pAddrInfo->ai_family, pAddrInfo->ai_socktype, pAddrInfo->ai_protocol);

if(bind(this->m_Socket, pAddrInfo->ai_addr, pAddrInfo->ai_addrlen) != 0)
continue;

break;
}

if(!pAddrInfo)
{
GetWinSockError(WSAGetLastError());
freeaddrinfo(pAddrInfo);
this->ShutDown();
return;
}

//7 = magic number recommended by 'beej's guide' online
if(listen(this->m_Socket, 7) != 0)
{
GetWinSockError(WSAGetLastError());
freeaddrinfo(pAddrInfo);
this->ShutDown();
return;
}

getnameinfo(pAddrInfo->ai_addr, pAddrInfo->ai_addrlen, pIPAddress, sizeof pIPAddress, pPortFinal, sizeof pPortFinal, NI_NUMERICHOST | NI_NUMERICSERV);

this->m_pIPAddress = Helpers::String::NewCopy(pIPAddress);
this->m_pPort = Helpers::String::NewCopy(pPortFinal);
cout << "IP:" << this->m_pIPAddress  << " Port:" << this->m_pPort << "\n";

this->SetState(NET_COMM_STATE__READY);

freeaddrinfo(pAddrInfo);

Вот мой код сервера (галочка).

NetServerClient*    pNetComm;
sockaddr*           pSockAddr;
sockaddr_storage    their_addr;
socklen_t           addr_size;
void*               pTempBuffer;
char                pIPAddress[INET6_ADDRSTRLEN];
char                pPort[256];
unsigned short      port;
int                 newClientSocket;

addr_size = sizeof their_addr;
newClientSocket = accept(this->m_Socket, (struct sockaddr*)(&their_addr), &addr_size);
if(newClientSocket == -1)
{
if(WSAGetLastError() != WSAEWOULDBLOCK)
GetWinSockError(WSAGetLastError());
return;
}

pSockAddr = (struct sockaddr*)(&their_addr);
pNetComm = new NetServerClient(newClientSocket);

addr_size = sizeof their_addr;
if(bind(newClientSocket, pSockAddr, addr_size) != 0)
{
GetWinSockError(WSAGetLastError());
pNetComm->ShutDown();
return;
}

if (pSockAddr->sa_family == AF_INET)
{
pTempBuffer = &(((struct sockaddr_in*)pSockAddr)->sin_addr);
port = ((struct sockaddr_in*)pSockAddr)->sin_port;
}
else
{
pTempBuffer = &(((struct sockaddr_in6*)pSockAddr)->sin6_addr);
port = ((struct sockaddr_in6*)pSockAddr)->sin6_port;
}
inet_ntop(their_addr.ss_family, pTempBuffer, pIPAddress, sizeof pIPAddress);
_snprintf(pPort, 256, "%d", (unsigned int)port);

pNetComm->StartCommunication(pIPAddress, pPort);
this->m_vpClients.push_back(pNetComm);

И вот мой код клиента:

addrinfo        hints;
addrinfo*       pAddrInfo;
unsigned long   tempUL;
int             error;

memset(&hints, 0, sizeof hints); // make sure the struct is empty
hints.ai_family = AF_UNSPEC;     // don't care IPv4 or IPv6
hints.ai_socktype = type;

error = getaddrinfo(pIPAddress, pPort, &hints, &pAddrInfo);
if(error != 0)
{
GetWinSockError(error);
return;
}

for(pAddrInfo = pAddrInfo; pAddrInfo != NULL; pAddrInfo = pAddrInfo->ai_next)
{
this->m_Socket = socket(pAddrInfo->ai_family, pAddrInfo->ai_socktype, pAddrInfo->ai_protocol);

if(connect(this->m_Socket, pAddrInfo->ai_addr, pAddrInfo->ai_addrlen) != 0)
continue;

break;
}

if(!pAddrInfo)
{
GetWinSockError(WSAGetLastError());
freeaddrinfo(pAddrInfo);
this->ShutDown();
return;
}

this->SetState(NET_COMM_STATE__READY);

freeaddrinfo(pAddrInfo);

Проблема в том, что подключиться к клиенту всегда не удается. Я получаю сообщение об ошибке «WSAECONNREFUSED: соединение отклонено».

Я почти уверен, что причина моего сбоя в соединении кроется в том, что мой клиент не передает правильный IP-адрес в getaddrinfo. Когда я запускаю свой сервер, я выводлю IP-адрес и порт серверного решения. Затем у меня есть клиентское решение, которое называется getaddrinfo с тем же IP-адресом и информацией о порте. Однако мое серверное решение, по-видимому, не собирает правильный IP-адрес и информацию о порте. Мне всегда говорят, что IP это 0.0.0.0 (IPv4) или :: (IPv6). Я не понимаю, как получить правильный IP-адрес для подключения моего клиента к моему серверу.

Я прочитал эти посты Получение ip сервера 0.0.0.0:0 от getaddrinfo () а также sin_port возвращен в getaddrinfo неправильно уже и попробовал их решения, но они не работали для меня.

Любая помощь приветствуется.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]