c++简单聊天不工作与我的IP地址

C++ simple chat not working with my IP address

本文关键字:我的 IP 地址 工作 简单 聊天 c++      更新时间:2023-10-16

我用客户端和服务器编写了一个简单的聊天程序。当我使用像192.168.1.1或127.0.0.1这样的本地IP时,程序可以工作,但如果我尝试使用我的互联网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;
}

和Server的代码:

#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] = '';
            printf("RECEIVED: ");
            printf(Buffer);
            printf("n");
            if(Buffer[0] == ' ')
            {
                break;
            }
        }
    }
    WSACleanup();
    return 0;
}

除非您的计算机网络接口直接为您分配了面向internet的IP,否则您应该始终绑定到LAN IP。绑定的IP地址仅仅定义了程序将使用哪些网络接口进行通信。

从WinSock bind()文档,似乎你可以绑定到INADDR_ANY监听所有接口。

可能的配置:

  1. 客户端在同一台计算机上。将服务器绑定到本地主机(127.0.0.1),并通过客户端连接到本地主机。

  2. 客户端在同一网络。将服务器绑定到LAN IP(例如192.168.1.10),并使用客户端连接到LAN IP。

  3. Internet客户端。将服务器绑定到LAN IP,从路由器转发端口,并与客户端连接到WAN/Internet IP。

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

对于选项4,一些网络将允许您从LAN内部连接到WAN IP,从而简化配置。在简单的家用路由器上,这可以通过在路由器设置中设置"NAT Loopback"这样的选项来启用。它通常在"允许在互联网上ping/ICMP","SPI防火墙"answers"阻止标识端口"等设置附近。