1

WinSock「127.0.0.1」と定義するとうまくいきますが、「 109.95.202.122 」MY_IPと定義したいのですが、うまくいきませんMY_IP

私は失敗しました:Fail bind()そしてListen Error

#pragma comment(lib, "Ws2_32.lib")

#include <sdkddkver.h>
#include <conio.h>
#include <stdio.h>

#include <WinSock2.h>
#include <Windows.h>
#include <iostream>
#include <string>
#include <process.h>
#define MY_IP       "109.95.202.122"
using namespace std;
int main()
{
    WSADATA wsaData;

    int result = WSAStartup( MAKEWORD( 2, 2 ), & wsaData );
    if( result != NO_ERROR )
        cout << "Initialization error." << endl;
    SOCKET mainSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
    if( mainSocket == INVALID_SOCKET )
    {
        printf( "Error creating socket: %ld\n", WSAGetLastError() );
        WSACleanup();
        return 1;
    }
    sockaddr_in service;
    memset( & service, 0, sizeof( service ) );
    service.sin_family = AF_INET;
    service.sin_addr.s_addr = inet_addr(MY_IP);
    service.sin_port = htons( 27015 );
    if(bind(mainSocket, (SOCKADDR*)&service, sizeof(service))== SOCKET_ERROR)
    {
        cout << "Fail bind()" << endl;
        closesocket( mainSocket );
    }
    if(listen(mainSocket, 1) ==  SOCKET_ERROR)
    {
        cout << "Listen Error";
    }
    cout << "Oczekiwanie na polaczenie" << endl;
    SOCKET acceptSocket = SOCKET_ERROR;
    while( acceptSocket == SOCKET_ERROR )
    {
        acceptSocket = accept( mainSocket, NULL, NULL);
    }
    if( acceptSocket != SOCKET_ERROR)
    {
        cout << "Connected ! :D" << endl;     
        for(;;)
        {
            char chWiadomosc[1000];
            recv(mainSocket, chWiadomosc, sizeof(chWiadomosc), NULL);

        }
    }
}
4

1 に答える 1

1

または失敗したbind()場合listen()は、呼び出しWSAGetLastError()て失敗した理由を調べます。

サーバーが 127.0.0.1 にバインドされている場合、クライアントは 127.0.0.1 にのみ接続できます。クライアントが 109.95.202.122 に接続する必要がある場合、サーバーは、クライアントを受け入れるローカル IP にバインドするか、INADDR_ANY使用可能なすべてのローカル IP にバインドするように指定する必要があります。109.95.202.122 がサーバーのローカル IP である場合、すべて問題ありません。ただし、109.95.202.122 が実際にサーバーが背後で実行されているルーター/NAT のパブリック IP である場合、サーバーは、受信要求をポート転送するようにルーター/NAT が構成されているローカル IP にバインドする必要があります。 bind()実行中のマシンに属するローカル IP にのみバインドできbind()ます。

于 2013-06-20T17:48:36.847 に答える