我开发了一个应用程序,客户端和服务器可以使用UDP套接字相互通信。 我在客户端使用了环回地址,在服务器端使用了INADDR_ANY。该程序在同一台机器上运行良好。 但是当我尝试从另一台计算机运行客户端时,通信失败。这是代码片段: 服务器
#define PORT 8888 //The port on which to listen for incoming data
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
{
exit(EXIT_FAILURE);
}
///Create a socket///
if((socketIdentifier = socket(AF_INET , SOCK_DGRAM , 0 )) == INVALID_SOCKET)
{
//"Socket not created"
}
///Socket Created///
///Prepare the sockaddr_in structure///
serverSocket.sin_family = AF_INET;
serverSocket.sin_addr.s_addr = INADDR_ANY;
serverSocket.sin_port = htons( PORT );
///Bind///
if( bind(socketIdentifier ,(struct sockaddr *)&serverSocket , sizeof(serverSocket)) == SOCKET_ERROR)
{
//"Bind Failed"
}
///Bind Done///
if((recv_len = recvfrom(socketIdentifier, receiveBuffer, sizeof(receiveBuffer), 0, (struct sockaddr *) &clientSocket, &clientSocketLength)) == SOCKET_ERROR)
{
"Could not Receive Data"
}
hDeviceContext = BeginPaint(AH_Glb_windowHandle, &ps );
TextOut(GetDC(AH_Glb_windowHandle),10,10+i,receiveBuffer,recv_len);
EndPaint( AH_Glb_windowHandle, &ps );
客户端:
#define PORT 8888 //The port on which to listen for incoming data
#define SERVER "58.65.172.11" //ip address of udp server
///Initialise winsock///
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
{
//Socket Initialization Failed///
exit(EXIT_FAILURE);
}
///create socket///
if ((socketIdentifier=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR)
{
///Socket Creation Failed///
exit(EXIT_FAILURE);
}
///setup address structure///
memset((char *) &connectedSocket, 0, sizeof(connectedSocket));
connectedSocket.sin_family = AF_INET;
connectedSocket.sin_port = htons(PORT);
connectedSocket.sin_addr.S_un.S_addr = inet_addr(SERVER);
if (sendto(socketIdentifier,sendBuffer,strlen(sendBuffer) , 0 , (struct sockaddr *) &connectedSocket, sizeof(connectedSocket)) == SOCKET_ERROR)
{
MessageBox(NULL,
"Sending Failed",
"Failure",
MB_ICONINFORMATION);
exit(EXIT_FAILURE);
}
答案 0 :(得分:3)
任何机构都能解释我是怎么发生的吗?
不看代码,我猜你的router阻止了端口。
首先..
我正在使用我的IP网站找到机器的IP 服务器正在运行。如果客户端在生成的IP地址上进行通信 通过这个网站,通讯没有用。
因为它为您提供了网络的外部 IP地址。您的ISP分配给您的那个。您的路由器位于您的计算机(或网络)和Internet之间,默认情况下阻止所有外部入站通信。
然后......
但是当我使用ipconfig命令查找Server的机器的IP时, 我发现的IP地址与我的IP产生的IP地址不同 网站,现在当我试图从服务器的客户端进行通信时 通过ipconfig生成的IP地址,通信工作正常。
原因ipconfig为您提供了LAN中路由器分配的本地 IP。
路由器,为了保护其后面的本地网络,过滤所有入站通信,除非您明确告诉他们不要。
第一次尝试连接服务器时,您使用了路由器阻止的外部IP 地址。第二次使用从ipconfig
获得的本地IP 地址,这很好,因为路由器没有阻止它们。
这是一个简单的图表....
Client (local IP)--------
|
Router --- Internet (external IP)
|
Server (local IP)--------
如果您想从互联网上的任何位置访问服务器,则需要在路由器中forward the port,以便外部世界可以看到服务器。但在开放服务器和应用程序之前,请务必保护它。
如果您只是在测试,或者您将仅在网络中使用此服务器,那么只需使用本地IP即可。另外,尝试为服务器分配一个静态IP地址,这样您就可以在代码中使用它,而无需重新编译代码。