用VC写的一个聊天软件,局域网用IP:192.168.1.101来创建服务器;客户端直接连接192.168.1.101就可以进行聊天现在我想用我的电脑(XP系统)做一个外网的小型服务器,那么外网用哪个IP地址来创建服务器呢??还是用192.168.1.101这个吗,或是通过使用花生壳获取域名的IP地址183.1.213.141来创建服务器呢??还有客户端程序要连接哪一个IP地址,是192.168.1.101还是183.1.213.141这个??为什么我用183.1.213.141创建SOCKET会不成功??
CString sIPAddress;
struct hostent FAR *lpHostEnt=gethostbyname("chymezh.gicp.net");
if(lpHostEnt == NULL)
{
sIPAddress = _T("");
}
LPSTR lpaddr = lpHostEnt->h_addr_list[0];
if(lpaddr)
{
struct in_addr inAddr;
memmove (&inAddr,lpaddr, 4);
sIPAddress=inet_ntoa (inAddr);
if(sIPAddress.IsEmpty())
sIPAddress=_T("Not available");
}
//AfxMessageBox(sIPAddress);
//获取主机名称
//char host[MAX_PATH];
//gethostname(host,MAX_PATH);
//m_HostName = host;
//hostent* phost = gethostbyname(host);
//if (phost)
//{
// char* pIP = inet_ntoa(*(in_addr*)phost->h_addr_list[0]);
// m_HostIP = pIP;
//} if(m_SrvSock.m_hSocket == INVALID_SOCKET)
{
BOOL bFlag = m_SrvSock.Create(m_iPort,SOCK_STREAM,sIPAddress);
if(!bFlag)
{
AfxMessageBox("Socket 创建失败!");
m_SrvSock.Close();//关闭监听套接字
PostQuitMessage(0);//退出窗口
return;
}
}
m_SrvSock.Init(this);
if(!m_SrvSock.Listen(15))
{
int nErrorCode = m_SrvSock.GetLastError();//检测错误信息
if (nErrorCode!=WSAEWOULDBLOCK)//如果不是线程被阻塞
{
AfxMessageBox("Socket错误!");
m_SrvSock.Close();//关闭套接字
PostQuitMessage(0);//关闭窗口
return;
}
}
Server: ns1.oray.net
Address: 61.152.96.118Name: chymezh.gicp.net
Address: 183.1.100.155
在路由里面我也设置了虚拟服务器:服务端口:6000;IP地址:192.168.1.101;协议:TCP;启用
这是端口映射吗??
没的话就需要做个端口映射,主要是内网在公网上,一般情况下外网是访问不了的内网的,如果要访问就需要一个映射,可以固定映射
struct hostent FAR *lpHostEnt=gethostbyname("chymezh.gicp.net");
if(lpHostEnt == NULL)
{
sIPAddress = _T("");
}
LPSTR lpaddr = lpHostEnt->h_addr_list[0];
if(lpaddr)
{
struct in_addr inAddr;
memmove (&inAddr,lpaddr, 4);
sIPAddress=inet_ntoa (inAddr);
if(sIPAddress.IsEmpty())
sIPAddress=_T("Not available");
}
两种方法解决:
1.路由器里做端口映射,服务端监听这个映射的端口,客户端连路由器的WAN口ip和映射的这个端口就可以了
2.在路由器里,设置DMZ手机,添上你的IP地址,这样你的机器就完全暴露于外网了。你的服务端可以监听任何一个端口,客户端只需要连接路由器wan口IP和你监听的端口
花生壳是针对动态IP的,adsl每次拨号后分配的ip都不同,如果你的程序把ip写死了,路由器一重新拨号ip就变了,花生壳可以解决这个问题。建议先把端口映射做好,先不考虑动态IP的问题。
用户1登录后,服务器记录用户1的IP地址。
当用户2登陆后,服务器也同样记录用户2的IP地址。
而用户1和用户2要通信时,就得通过服务器获取对方的IP地址。