C++ Internet上的UDP协议
我有一个小问题:我想编写一个简单的应用程序,在本例中发送一个小词:Hello to a server。此服务器应通过cout显示它。这只是一个学习网络编程如何在C++中工作的项目,因为我想创建一个小型的Internet游戏。这也是我使用UDP而不是TCP的原因 问题如下:当我启动电脑上的服务器和电脑上的客户端,并输入127.0.0.1作为发送单词的ip地址时,它工作正常,如果输入本地ip,也工作正常。但是,如果我输入我的公共ip,服务器将不会接收任何内容 当我在笔记本电脑上运行Clicnt,连接到与PC相同的LAN,并输入路由器的公共ip时,它也可以工作。当我在互联网上尝试时,我的一个朋友运行客户端,服务器没有收到任何东西。我将我尝试的所有端口转发到我的电脑,并禁用防火墙和所有防病毒软件 我在谷歌上搜索了两天,但什么也没找到。也许有人能帮我 这是我的代码,如果对你有帮助的话 服务器: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,连接
#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。是的,我为这两个路由器转发了它。