Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Internet上的UDP协议_C++_Sockets_Network Programming_Udp_Winsock - Fatal编程技术网

C++ Internet上的UDP协议

C++ Internet上的UDP协议,c++,sockets,network-programming,udp,winsock,C++,Sockets,Network Programming,Udp,Winsock,我有一个小问题:我想编写一个简单的应用程序,在本例中发送一个小词:Hello to a server。此服务器应通过cout显示它。这只是一个学习网络编程如何在C++中工作的项目,因为我想创建一个小型的Internet游戏。这也是我使用UDP而不是TCP的原因 问题如下:当我启动电脑上的服务器和电脑上的客户端,并输入127.0.0.1作为发送单词的ip地址时,它工作正常,如果输入本地ip,也工作正常。但是,如果我输入我的公共ip,服务器将不会接收任何内容 当我在笔记本电脑上运行Clicnt,连接

我有一个小问题:我想编写一个简单的应用程序,在本例中发送一个小词:Hello to a server。此服务器应通过cout显示它。这只是一个学习网络编程如何在C++中工作的项目,因为我想创建一个小型的Internet游戏。这也是我使用UDP而不是TCP的原因

问题如下:当我启动电脑上的服务器和电脑上的客户端,并输入127.0.0.1作为发送单词的ip地址时,它工作正常,如果输入本地ip,也工作正常。但是,如果我输入我的公共ip,服务器将不会接收任何内容

当我在笔记本电脑上运行Clicnt,连接到与PC相同的LAN,并输入路由器的公共ip时,它也可以工作。当我在互联网上尝试时,我的一个朋友运行客户端,服务器没有收到任何东西。我将我尝试的所有端口转发到我的电脑,并禁用防火墙和所有防病毒软件

我在谷歌上搜索了两天,但什么也没找到。也许有人能帮我

这是我的代码,如果对你有帮助的话

服务器:

#include <iostream>
#include <winsock2.h>

using namespace std;

int main()
{
    //Benötigter Aufruf vor Socketinitialisierung
    WSAData w;
    if(int res = WSAStartup(MAKEWORD(2,2),&w) != 0)
    {
        cout << "Sockets konnten nicht initialisiert werden: "<<res << endl;
        return 1;
    }

    //Socket initialisieren
    cout << "Socket wird initialisiert" << endl;
    int sock = socket(AF_INET, SOCK_DGRAM, 0); //AF_INET = benutze IPv4 SOCK_DGRAM = Verbindungslos, IPPROTO_UDP = Protokoll UDP
    if(sock == -1)
    {
        cout << "Socket konnte nicht erstellt werden" << endl;
        return 1;
    }

    SOCKADDR_IN sockAdress;
    sockAdress.sin_family = AF_INET;

    cout << "Port:" << endl;
    unsigned short port;
    cin >> port;

    sockAdress.sin_port = htons(port);
    sockAdress.sin_addr.s_addr = ADDR_ANY;

    cout << "Verbindung wird gebunden..." << endl;

    int bindResult = bind(sock,reinterpret_cast<sockaddr*>(&sockAdress),sizeof(sockAdress));
    if(bindResult==-1)
    {
        cout << "Konnte Socket nicht binden" << endl;
        return 1;
    }
    cout << "Erfolgreich gebunden!" << endl;

    while(true)
    {
        char buf[256];
        sockaddr_in clientSock;
        int length = sizeof(SOCKADDR_IN);
        int recError = recvfrom(sock,reinterpret_cast<char*>(&buf),sizeof(buf),0,reinterpret_cast<sockaddr*>(&clientSock),&length);
        if(recError == SOCKET_ERROR)
        {
            cout << "Error receving Message" << endl;
        }
        buf[recError] = '\0';
        cout << buf;
    }

    closesocket(sock);
    WSACleanup();
    return 0;
}
客户:

#include <iostream>
#include <winsock2.h>

using namespace std;

int main()
{
    //Benötigter Aufruf vor Socketinitialisierung
    WSAData w;
    if(int res = WSAStartup(MAKEWORD(2,2),&w) != 0)
    {
        cout << "Sockets konnten nicht initialisiert werden: "<<res << endl;
        return 1;
    }

    //Socket initialisieren
    cout << "Socket wird initialisiert" << endl;
    int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); //AF_INET = benutze IPv4, SOCK_DGRAM = Verbindungslos, IPPROTO_UDP = Protokoll UDP
    if(sock == -1)
    {
        cout << "Socket konnte nicht erstellt werden" << endl;
        return 1;
    }

    SOCKADDR_IN sockAdress;
    sockAdress.sin_family = AF_INET;


    cout << "IP Adresse:" << endl;
    string ip;
    cin >> ip;

    cout << "Port:" << endl;
    unsigned short port;
    cin >> port;
    cout << port << endl;

    sockAdress.sin_port = htons(port);
    sockAdress.sin_addr.S_un.S_addr = inet_addr(ip.c_str());

    cout << "Verbindung wird hergestellt..." << endl;

    string sendText = "Hallo\n";
    cout << sendText.c_str() << endl;
    int sendError = sendto(sock,sendText.c_str(),sendText.length(),0,reinterpret_cast<sockaddr*>(&sockAdress), sizeof(sockAdress));
    if(sendError==SOCKET_ERROR){
        cout << "Konnte nicht senden... " << sendError << endl;
    }

    closesocket(sock);
    WSACleanup();
    return 0;
}

如果你的机器在防火墙后面,那么它就不是真正的“在”互联网上。它位于专用网络上,路由器充当互联网的网关。这是出于设计原因,因为:

它使您的计算机安全[r]

世界上没有足够的internet地址给每个主机一个

您需要执行以下步骤:

确定路由器的internet地址,并将其用作客户端程序的目标。例如:

将路由器配置为将端口转发到服务器计算机的本地网络地址应以192、172或10开头。这允许internet主机通过网关向服务器发送数据包

找一本关于TCP/IP网络的书,尽可能多地阅读网络地址翻译


如果它在本地工作,那么这不是程序的问题,而是路由器配置的问题。所以这是离题了。请尝试superuser.com。您使用的端口是什么?某些ISP会阻止低于某个范围的所有端口,这可以解释为什么您没有接收到任何内容。例如10000,我使用的是端口25565 minecraft端口,因为我知道它与minecraft一起工作server@DMCKITT:虽然您的错误处理需要一些工作,但代码很好。这是一个网络问题,而不是编码问题。仔细检查您的路由器/防火墙设置,仔细检查您朋友的路由器/防火墙设置,仔细检查您ISP的阻止策略,并使用数据包嗅探器(如WireShark)检查您和您朋友之间的每个网段是否正在传输和接收数据包。很可能,您会发现从您朋友的电脑发送的数据包没有到达您的服务器电脑。它们可能在线丢失,或者您的路由器没有转发。谢谢您的帮助,但我知道所有这些。。。我已经将端口转发到我的本地ip。我还通知了我NAT,但这对我没有帮助…@DMCKITT你转发UDP的端口了吗?路由器通常默认选择TCP。是的,我为这两个路由器转发了它。