c++简单聊天不工作与我的IP地址
C++ simple chat not working with my IP address
我用客户端和服务器编写了一个简单的聊天程序。当我使用像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
监听所有接口。
可能的配置:
-
客户端在同一台计算机上。将服务器绑定到本地主机(127.0.0.1),并通过客户端连接到本地主机。
-
客户端在同一网络。将服务器绑定到LAN IP(例如192.168.1.10),并使用客户端连接到LAN IP。
-
Internet客户端。将服务器绑定到LAN IP,从路由器转发端口,并与客户端连接到WAN/Internet IP。
-
通过Internet和LAN的客户端。将服务器绑定到LAN IP并从路由器转发端口。您可以从LAN连接到LAN IP,从Internet客户端连接到WAN/Internet IP。
对于选项4,一些网络将允许您从LAN内部连接到WAN IP,从而简化配置。在简单的家用路由器上,这可以通过在路由器设置中设置"NAT Loopback"这样的选项来启用。它通常在"允许在互联网上ping/ICMP","SPI防火墙"answers"阻止标识端口"等设置附近。
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 我的字符计数代码计算错误.为什么
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- cmake在我的项目中所需的所有静态库都不成功
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- 将静态 IP 分配给我的 ESP32 服务器后不再响应
- 使用Boost库中的PC中获取我的以太网设备IP地址的列表
- 如何获取其他人可以使用的IP来连接到我的c 中的套接字构建
- 将域的IP保存到TXT文件/将我的动态IP保存到带有C 或批处理的TXT文件中
- 如何使用Qt确定我的互联网IP是否属于给定的IP列表
- 如何获取我的计算机外部IP地址
- 为什么我无法在 C++ 中键入要连接的 IP
- 如何找出WSD打印机的IP地址?我想使用 WSD API,但无法使用 IWSDDiscoveredDevice
- 我的程序不发送消息或没有接收到套接字,ip是127.0.0.1
- 我如何在c++中获得所有发送数据包到机器的ip地址
- 获取我的IP地址并使用c++将其转换为字节
- c++简单聊天不工作与我的IP地址