C ++ простой чат не работает с моим IP-адресом - PullRequest
0 голосов
/ 26 августа 2011

Я написал небольшую простую программу чата с клиентом и сервером.Когда я использую локальный 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 Ответ

2 голосов
/ 26 августа 2011

Если сетевой интерфейс вашего компьютера не назначен напрямую вашему интернет-IP-адресу, вы всегда должны связываться с IP-адресом локальной сети.Связанный IP-адрес просто определяет, какие сетевые интерфейсы программа будет использовать для связи.

Из документации WinSock bind() кажется, что вы можете привязаться к INADDR_ANY для прослушивания всех интерфейсов.

Возможные конфигурации:

  1. Клиент на том же компьютере.Свяжите сервер с локальным узлом (127.0.0.1) и подключитесь к локальному узлу с клиентом.

  2. Клиент в той же сети.Свяжите сервер с IP-адресом вашей локальной сети (что-то вроде 192.168.1.10) и подключитесь к IP-адресу локальной сети с помощью клиента.

  3. Клиент через Интернет.Свяжите сервер с IP-адресом вашей локальной сети, перенаправьте порт с маршрутизатора и подключитесь к IP-адресу WAN / Internet с клиентом.

  4. Клиенты как через Интернет, так и по локальной сети.Свяжите сервер с IP-адресом вашей локальной сети и перенаправьте порт с вашего маршрутизатора.Вы можете подключиться к IP-адресу локальной сети из локальной сети и IP-адресу WAN / Internet от интернет-клиентов.

Для варианта 4 некоторые сети позволяют подключаться к IP-адресу WAN изнутриЛокальная сеть, упрощающая настройку.На простом домашнем маршрутизаторе это потенциально может быть включено через опцию типа «NAT Loopback» в настройках вашего маршрутизатора.Часто он находится рядом с такими настройками, как «разрешить ping / ICMP в Интернете», «брандмауэр SPI» и «порт идентификатора блока».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...