C ++简单聊天无法使用我的IP地址

时间:2011-08-26 18:43:07

标签: c++ sockets networking

我已经与客户端和服务器编写了一个简单的聊天程序。当我使用本地IP如192.168.1.1或127.0.0.1时,该程序可以工作,但如果我尝试使用我的互联网IP,它将无法正常工作。 我关闭了我的计算机上的防火墙,我有端口转发端口17000(尝试其他端口),但它仍然无法正常工作。 可能是什么问题?

以下是客户端的代码:

#define _WINSOCK_
#include <WinSock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
#define SERVER_ADDRESS "127.0.0.1"
#define SERVER_PORT 17000
#define MESSAGE_SIZE 256
WSADATA Winsock;
SOCKET Socket;
sockaddr_in ServerAddress;
char Buffer[MESSAGE_SIZE];
int main()
{
    WSAStartup(MAKEWORD(2,2),&Winsock);
    if(LOBYTE(Winsock.wVersion) != 2 || HIBYTE(Winsock.wVersion) != 2)
    {
        WSACleanup();
        return 1;
    }

    Socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    ZeroMemory(&ServerAddress, sizeof(ServerAddress));
    ServerAddress.sin_family = AF_INET;
    ServerAddress.sin_addr.s_addr = inet_addr(SERVER_ADDRESS);
    ServerAddress.sin_port = SERVER_PORT;

    while(true)
    {
        gets(Buffer);
        sendto(Socket, Buffer, MESSAGE_SIZE, 0, (sockaddr*)&ServerAddress, sizeof(ServerAddress));
        if(Buffer[0]== ' ')
        {
            break;
        }
    }
    WSACleanup();
    return 0;
}

服务器的代码:

#define _WINSOCK_
#include <WinSock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
#define SERVER_ADDRESS "127.0.0.1"
#define SERVER_PORT 17000
#define MESSAGE_SIZE 256
WSADATA Winsock;
SOCKET Socket;
char Buffer[MESSAGE_SIZE];
sockaddr_in ServerAddress;
int SizeInt = sizeof(ServerAddress);
int main()
{
    WSAStartup(MAKEWORD(2,2), &Winsock);
    if(LOBYTE(Winsock.wVersion) != 2 || HIBYTE(Winsock.wVersion) != 2)
    {
        WSACleanup();
        return 1;
    }
    Socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    ZeroMemory(&ServerAddress, sizeof(ServerAddress));
    //ServerAddress.sin_addr.s_addr = inet_addr(SERVER_ADDRESS);
    ServerAddress.sin_family = AF_INET;
    ServerAddress.sin_port = SERVER_PORT;
    bind(Socket, (sockaddr*)&ServerAddress, sizeof(ServerAddress));
    while(true)
    {
        if(recvfrom(Socket, Buffer, MESSAGE_SIZE, 0, (sockaddr*)&ServerAddress, &SizeInt))
        {
            Buffer[MESSAGE_SIZE - 1] = '\0';
            printf("RECEIVED: ");
            printf(Buffer);
            printf("\n");

            if(Buffer[0] == ' ')
            {
                break;
            }
        }
    }
    WSACleanup();
    return 0;
}

1 个答案:

答案 0 :(得分:2)

除非您的计算机的网络接口直接分配了面向Internet的IP,否则应始终绑定到LAN IP。绑定的IP地址只定义程序将用于通信的网络接口。

WinSock bind() documentation开始,您似乎可以绑定到INADDR_ANY来监听所​​有接口。

可能的配置:

  1. 同一台计算机上的客户端。将服务器绑定到localhost(127.0.0.1),并使用客户端连接到localhost。

  2. 同一网络上的客户端。将服务器绑定到您的LAN IP(类似于192.168.1.10),并使用客户端连接到LAN IP。

  3. 通过互联网的客户端。将服务器绑定到LAN IP,从路由器转发端口,然后通过客户端连接到WAN / Internet IP。

  4. 通过Internet和LAN的客户端。将服务器绑定到LAN IP并从路由器转发端口。您可以从LAN连接到LAN IP,从Internet客户端连接到WAN / Internet IP。

  5. 对于选项4,某些网络允许您从LAN内部连接到WAN IP,从而简化配置。在简单的家庭路由器上,可以通过路由器设置中的“NAT Loopback”等选项启用此功能。它通常接近“允许在互联网上ping / ICMP”,“SPI防火墙”和“阻止识别端口”等设置。