私はいくつかのネットワークコードに取り組んでいます。同じマシンで 2 つのソリューションを実行しています。1 つはサーバーで、もう 1 つはクライアントです。ネットワーク ソリューションに 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 とポートが出力されます。次に、同じ IP とポート情報を使用してクライアント ソリューションに getaddrinfo を呼び出します。しかし、私のサーバー ソリューションは正しい IP とポート情報を収集していないようです。IPが0.0.0.0(IPv4)または::(IPv6)のいずれかであることが常にわかります。クライアントがサーバーに接続するための適切な IP を取得する方法がわかりません。
私はこれらの投稿を読んでgetaddrinfo ()からサーバー ip 0.0.0.0:0を取得しています。
どんな助けでも大歓迎です。