C++ bind()和listen()函数出错(WinSock)

C++ bind()和listen()函数出错(WinSock),c++,winsock,C++,Winsock,我使用的是WinSock,我有一个问题:如果我将MY_IP定义为“127.0.0.1”,这是可行的,但我不希望这样,我想将MY_IP定义为“109.95.202.122”,但它不起作用 我失败了:fail bind()和侦听错误 #pragma comment(lib, "Ws2_32.lib") #include <sdkddkver.h> #include <conio.h> #include <stdio.h> #include <WinSoc

我使用的是
WinSock
,我有一个问题:如果我将
MY_IP
定义为“127.0.0.1”,这是可行的,但我不希望这样,我想将
MY_IP
定义为“109.95.202.122”,但它不起作用

我失败了:
fail bind()
侦听错误

#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);

        }
    }
}
#pragma注释(lib,“Ws2_32.lib”)
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义我的IP“109.95.202.122”
使用名称空间std;
int main()
{
WSADATA WSADATA;
int result=WSAStartup(MAKEWORD(2,2)和wsaData);
如果(结果!=无错误)
cout如果
bind()
listen()
失败,请调用
WSAGetLastError()
以了解失败的原因

如果服务器将自身绑定到127.0.0.1,则客户端只能连接到127.0.0.1。如果客户端需要连接到109.95.202.122,则服务器需要绑定到将接受客户端的本地IP,或指定
INADDR_ANY
绑定到所有可用的本地IP。如果109.95.202.122是服务器的本地IP,则一切都是我们的ll.但是,如果109.95.202.122实际上是服务器运行的路由器/NAT的公共IP,则服务器需要绑定到路由器/NAT配置为向其转发inbounds请求的本地IP。
bind()
只能绑定到属于
bind()的机器的本地IP
正在运行。

如果
bind()
listen()
失败,请调用
WSAGetLastError()
以了解失败的原因

如果服务器将自身绑定到127.0.0.1,则客户端只能连接到127.0.0.1。如果客户端需要连接到109.95.202.122,则服务器需要绑定到将接受客户端的本地IP,或指定
INADDR_ANY
绑定到所有可用的本地IP。如果109.95.202.122是服务器的本地IP,则一切都是我们的ll.但是,如果109.95.202.122实际上是服务器运行的路由器/NAT的公共IP,则服务器需要绑定到路由器/NAT配置为向其转发内边界请求的本地IP。
bind()
只能绑定到属于运行
bind()
的机器的本地IP