1

私はいくつかのネットワークコードに取り組んでいます。同じマシンで 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を取得しています。

どんな助けでも大歓迎です。

4

0 に答える 0