2 xiaohan005 xiaohan005 于 2013.09.12 11:40 提问

socket编程——内网ping公网失败

我电脑连的是铁通的公网,在做一个C/S socket编程。在我一台电脑上客户端和服务器之间可以正常发送数据,但是客户端放到别的可以上网的电脑上时就连不上了。我用ping命令检测过网络情况,基本上都ping不通。只有一次一个同学在公司用他的电脑ping通了,不过是单向的,我还是Ping不通他的,服务器和客户端之间还是发送不了数据。有哪位高手知道是什么原因?谢谢!
服务器端部分代码如下:
//设定地址
serv.sin_addr.s_addr=htonl(INADDR_ANY);
serv.sin_family=AF_INET;
serv.sin_port=5000;//htons(5000);
addlen=sizeof(serv);
m_button.EnableWindow(FALSE);//退出为假
//创建socket
sock=socket(AF_INET,SOCK_STREAM,0);
BOOL val=true;
if(setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char )val,sizeof(val))!=0);
{
printf("error!setsocket failed!/n");
// return -1;
}
//将socket绑定到服务器上
if (bind(sock,(sockaddr
)&serv,addlen))
{
m_edit.SetWindowText("绑定错误");
}else
{
//m_list.InsertItem(count++,inet_ntoa(serv.sin_addr));
m_edit.SetWindowText("服务器创建成功");
//开始侦听

listen(sock,5);
客户端:
cli.sin_addr.s_addr=inet_addr(ipaddress);
cli.sin_family=AF_INET;
cli.sin_port=5000;//htons(5000);
//创建socket
clisock=socket(AF_INET,SOCK_STREAM,0);

val=true;
if(setsockopt(clisock,SOL_SOCKET,SO_REUSEADDR,(char *)val,sizeof(val))!=0);
{
printf("error!setsocket failed!/n");
// return -1;
}

  if(connect(dlg->clisock,(sockaddr*)&(dlg->cli),sizeof(dlg->cli))==INVALID_SOCKET)
{
    printf("connet()failed:%d\n",WSAGetLastError());
    dlg->m_edit.SetWindowText("等待.....");
}
else
{       
    dlg->m_list.InsertItem(dlg->count++,"连接成功");
    dlg->m_button1.EnableWindow(TRUE);  
    dlg->SetForegroundWindow();
}
//接收数据
while(s!=SOCKET_ERROR && dlg->ee!=0)
{
    //调用recv函数接收数据
    s=recv(dlg->clisock,buff,100,0);
    dlg->SetForegroundWindow();//做什么?
    //如果没有接收错误,同时没有断开连接,则显示接收到的数据
    if (s!=SOCKET_ERROR && dlg->ee!=0)
    dlg->m_list.InsertItem(dlg->count++,buff);
    dlg->m_list.Scroll(size);
}

2个回答

yaoxing116
yaoxing116   2013.09.12 11:45
已采纳

ping不通说明网络不通,你的程序肯定发送不了数据的,先保证客户端所在的机器能ping通服务端所在的机器,然后再测试你的程序。

xiaohan005
xiaohan005 双方的防火墙都已经关闭。
接近 5 年之前 回复
xiaohan005
xiaohan005 我在我们学校实验室内网测了,双方都能Ping通就可以发送数据;让同学在公司那边作为客户端,他ping我,仅能单向ping通,双方还是不能发送数据。我觉得应该双向都ping通才可以。请问两台电脑,一台公网(服务器),一台内网(客户端),要ping通的话需要什么条件呢?
接近 5 年之前 回复
oyljerry
oyljerry   Ds   Rxr 2015.01.05 18:27

内网ip ping 公网ip机器,可以。
反过来不行,因为内网地址没法直接访问

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
解决腾讯云windows系统能ping通内网地址,ping不通网关和公网地址
腾讯云win2012R2 ping不通网关和公网地址
从外网通过路由器ping内网IP的方法
TP-Link路由器自带了一个PING工具,以前一直以为是鸡肋,因为笔者习惯于使用WINDOWS命令行的PING工具,可以在本地网络中,很方便地ping本网或异网的IP。 近日,笔者在家里,需要控制公司的路由器,于是发现一个难题,就是无法使用笔者家里的电脑WINDOWS的命令行PING通过公司内部网络的IP。 于是,想到了路由器的网络诊断功能,发现这一妙用,利用它可以从外网通过路由器PING本
Socket编程之外网访问内网
如何将自己编写的TCP的服务器软件放到外网上去呢?这样不论是在哪里用什么网络都可以访问自己在局域网里的服务器了。 首先大家想到的应该是在路由器上作端口映射,即NAT(Network Address Translation),网络地址转换。 以装有NAT软件的路由器为例,局域网里的IP要想访问外网就必须经过NAT转换为外网IP,外网IP要想访问内网IP只能先访问到路由器,然后通过路由器的转发规则
关于ping本地公网IP不通。。
这两天碰到一挫事儿。 以前安装了花生壳,联通拨号上网,设置好后可以通过域名外网访问机器。 但是这两天换了移动的拨号上网,设置了下居然ping不通本地公网IP,纳了闷了。 好像设置都照旧,花生壳也正常运行,咋还不行。 后来才发现,是因为路由器DHCP服务设置中指定了缺省域名,fuck。 以下链接有用处,记录一下: http://service.oray.com
腾讯云公网ip访问不通的问题解决
////////////////////////2016/01/13////////////////////////// ///////////////////////by XBW//////////////////////////////// ///////////////////环境  windows server 2012/////   最近实在是烦透了,本以为是腾讯云的问题,结果是
亚马逊云无法ping通自己的ip的解决方法
真正的
电信外网ping路由器外网IP不通问题
我家里l路由是通过东方有线通动态获取IP上网的,路由防火墙没开,路由上做了个端口映射。。经朋友测试,联通上网的朋友有些个可以访问到我本机,电信上网的朋友ping都ping不通。。有什么办法可以让全公网的用户访问本机的路由器IP。。。花钱买域名不做考虑。。。。花生壳免费的域名也试过了,也没用。。 问题补充: 我防火墙都没开。。外网ip一率是可以ping我路由器IP的。我路由没做限制。
阿里云服务器ping不通解决办法(云服务器搭建完环境访问不了ip解决办法)
阿里云服务器ping不通解决办法(云服务器搭建完环境访问不了ip解决办法)问题:这里的服务器我以阿里云为例,学生套餐嘛,便宜,最近搞服务器,然后Ubuntu16.04下搭建LAMP环境后发现输入ip(http://1XX.XX.XX.XX1/samplepage.php)总是访问不了,如下 解决办法: 1. 登录阿里云ECS控制台,单击【安全组】>【配置规则】。 2. 选择【公网入方向
阿里云centos7公网ping不通
主要原因是因为安全组的原因问题,刚刚买来的服务器必须要配置安全组 下面介绍详细步骤 在服务器实例列表我们可以看到我们的服务器,点击更多 选择安全组配置 然后会出现下面的列表点击新建规则 然后按着下面截图填写在保存就可以了
TPLINK公网IP映射到内网
1、就在“转发规则”里把DMZ主机设成某个内网IP; 2、在“转发规则”里,“虚拟服务器”,添加一个端口号,一个IP,还有协议(一般是HTTP),然后启用,就OK了