我已经与客户端和服务器编写了一个简单的聊天程序。当我使用本地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;
}
答案 0 :(得分:2)
除非您的计算机的网络接口直接分配了面向Internet的IP,否则应始终绑定到LAN IP。绑定的IP地址只定义程序将用于通信的网络接口。
从WinSock bind()
documentation开始,您似乎可以绑定到INADDR_ANY
来监听所有接口。
可能的配置:
同一台计算机上的客户端。将服务器绑定到localhost(127.0.0.1),并使用客户端连接到localhost。
同一网络上的客户端。将服务器绑定到您的LAN IP(类似于192.168.1.10),并使用客户端连接到LAN IP。
通过互联网的客户端。将服务器绑定到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防火墙”和“阻止识别端口”等设置。