是一个简单的网络文本聊天程序。
IP用127.0.0.1可以正常使用,
用192.168.1.10也可以正常使用,但是因为我们用的是局域网,也就是说跟别的人的IP是一样的,
所以当IP换成61.191.**.**的时候,就连接不上了。
这种情况下,怎么弄才能让他连上?
服务器端代码:
#include <Winsock2.h>
#include <stdio.h>void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return; 
}
SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0); SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000); bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); char recvBuf[100];
char sendBuf[100];
char tempBuf[200]; SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR); while(1)
{
recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
if('q'==recvBuf[0])
{
sendto(sockSrv,"q",strlen("q")+1,0,(SOCKADDR*)&addrClient,len);
printf("Chat end!\n");
break;
}
sprintf(tempBuf,"%s say : %s",inet_ntoa(addrClient.sin_addr),recvBuf);
printf("%s\n",tempBuf);
printf("Please input data:\n");
gets(sendBuf);
sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrClient,len);
}
closesocket(sockSrv);
WSACleanup();
}客户端代码:
#include <Winsock2.h>
#include <stdio.h>void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return; 
} SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0); SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000); char recvBuf[100];
char sendBuf[100];
char tempBuf[200]; int len=sizeof(SOCKADDR); while(1)
{
printf("Please input data:\n");
gets(sendBuf);
sendto(sockClient,sendBuf,strlen(sendBuf)+1,0,
(SOCKADDR*)&addrSrv,len);
recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*)&addrSrv,&len);
if('q'==recvBuf[0])
{
sendto(sockClient,"q",strlen("q")+1,0,
(SOCKADDR*)&addrSrv,len);
printf("Chat end!\n");
break;
}
sprintf(tempBuf,"%s say : %s",inet_ntoa(addrSrv.sin_addr),recvBuf);
printf("%s\n",tempBuf); }
closesocket(sockClient);
WSACleanup();
}

解决方案 »

  1.   


    我连本机,
    本机开服务端和客户端。用本机的局域网地址就可以,
    用本机的IP地址就不行,
    因为我跟局域网内的其他电脑的IP地址一样。
    不知道怎么解决。
      

  2.   

    那个指你在公网访问你的某一台主机所做的映射。你在局域网里测试是不需要的。你把程序中 IP 地址改做对应不同电脑局域网 IP 地址试一下。 
      

  3.   

    你所说的“本机的IP地址”其实并不是本机的IP地址,而是局域网的公网IP,不属于任何一台电脑,所以连不上,“局域网地址”才是本机的IP地址。
    局域网内可以向公网电脑发起连接,而公网无法直接与局域网内的电脑连接,这种问题一般有三种解决方法:
    1、设置NAT端口映射,将公网发向某一个固定端口的数据转发到内网固定IP上;
    2、在公网上架一台服务器,所有电脑先登录到服务器,发送数据经过服务器转发;
    2、借助公网上的一台服务器,实现UDP“打洞”。
    你可以在网上搜索一下相关资料。
      

  4.   

    因为你后边测试时用的是公网IP,所以相应的也需要公网的端口号才能连接上可以使用UPNP技术或者一些工具来使得服务器开启的端口与公网端口一致或者映射完端口后,客户端设置连接到映射后的端口
      

  5.   


    那就需要 cnzdgs 所指明的办法了。
      

  6.   

    设置NAT端口映射是很简单的,就是网络设置,不需要编程。
      

  7.   

    你的IP属于局域网内网IP,你可去搜一下NAT穿越的文章,你就可以知道怎样做了,如果不知,可以联系我,我刚好也在写个广域网文件传输的程序,大家共同学习.