ACE 本机内可通信,两主机之间连接失败

sunshine757961368 2014-03-10 10:28:30
用ACE写了个程序,放在本机上自己连接自己是可以接受和发送消息的,运行无误,可是一放到另外一台电脑,想实现两台电脑之间的连通,就会连接失败,求大神指点
...全文
169 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunshine757961368 2014-03-11
  • 打赏
  • 举报
回复
引用 15 楼 neustar1 的回复:
初步认为错误在 ServerAddr.set(server_port,"localhost"); localhost使用的127.0.0.1,只能收到来自本机的连接 应该用0.0.0.0 你可以用netstat查看当前的端口使用情况,看看是不是绑定的127.0.0.1
啊~~~~~~~~~~~~~~~~~~~~~~~~~~~~果然是这个问题啊!!!!!!! 大神我真想拥抱你!!!!!我梗在这里一个星期了啊!!!!!!!!!!!!! 改成0.0.0.0就好了呢!!!!! 结贴,给分!!!
yifuzhiming 2014-03-10
  • 打赏
  • 举报
回复
失败的原因是什么,总有个报错吧
JianDom 2014-03-10
  • 打赏
  • 举报
回复
两台电脑是一个内网的吗,不是一个内网的话不能直接连接,需要一个中间外网服务器
__cc__ 2014-03-10
  • 打赏
  • 举报
回复
初步认为错误在 ServerAddr.set(server_port,"localhost"); localhost使用的127.0.0.1,只能收到来自本机的连接 应该用0.0.0.0 你可以用netstat查看当前的端口使用情况,看看是不是绑定的127.0.0.1
sunshine757961368 2014-03-10
  • 打赏
  • 举报
回复
引用 13 楼 neustar1 的回复:
[quote=引用 12 楼 sunshine757961368 的回复:] [quote=引用 11 楼 neustar1 的回复:] [quote=引用 10 楼 sunshine757961368 的回复:] [quote=引用 9 楼 neustar1 的回复:] 1)你先确定一下,是否防火墙影响的; 2)tcp本身是可以跨越路由器的,之所以有的路由器跨越不了, 是因为端口映射导致的,很多台机器共用一个ip对外访问,其中使用不同的端口来区分,外部是不能直接连接内部的任何一个ip的。 你如果非要验证自己代码正确性,找个局域网的机器测试一下代码就知道可不可以了。 cmd指令之类的是没有的,与路由器配置有关系。
1、我两边的防火墙都关闭了,就是为了避免影响 2、我确定两台电脑没有任何端口映射 3、我们两个主机就是在一个局域网里面。。。[/quote] 你用的ip地址可以是“192.168.1.1”到“192.168.1. 254[/quote] 是,一个是192.168.1.171,一个是192.168.1.82[/quote] 如果这样的话,应该是可以连通的,你最好把代码贴上来看看[/quote] 好,麻烦给我看看哈~

void Cserver_mfcDlg::OnBnClickedListen()//监听本地端口
{
	// TODO: 在此添加控件通知处理程序代码
	m_hThread_Server=CreateThread(NULL,100,Thread_Server,(void*)this,NULL,NULL);  //建立本地服务器端线程监听
}
DWORD Cserver_mfcDlg::Thread_Server(LPVOID lpParam)
{

	Cserver_mfcDlg *dlg=(Cserver_mfcDlg*)AfxGetApp()->GetMainWnd();
	dlg->MessageBox(_T("thread_server!"),_T("tip")); 
	dlg->lsn_port.GetWindowTextA(dlg->lsn_port_str);  //获取端口号
	int server_port=0;
	ACE::init();
	if(dlg->lsn_port_str=="")
	{
		server_port=10000;   //如果没填,则默认10000号

	}
	else
	{
		server_port=_ttoi(dlg->lsn_port_str);
	}
	ServerAddr.set(server_port,"localhost");
	if(ServerAcceptor.open(ServerAddr,1)!=0)   //绑定端口
	{
		//cout<<"band port failed!"<<endl;
		dlg->MessageBox(_T("band port failed!"),_T("band tip")); 
		//return -1;
	}
	else
	{
		
		dlg->MessageBox(_T("band port success!"),_T("band tip")); 
		ACE_Time_Value timeout(20,0);
		if(ServerAcceptor.accept(ServerPeer)==-1)   //与客户端建立连接
		{
			dlg->MessageBox(_T("server connect failed!"),_T("band tip")); 
		}
		else
		{
			dlg->MessageBox(_T("server connect success!"),_T("band tip")); 
			while((s_rev_byte=ServerPeer.recv(serverbuf,sizeof(serverbuf)))!=-1)
			{
				ACE_INET_Addr rome_addr;
				ServerPeer.get_local_addr(rome_addr);   //获取远端连接ip
				CString str_buf;
				dlg->msg_record_str+=rome_addr.get_host_name();
				str_buf=serverbuf;
				str_buf=":"+str_buf.Left(s_rev_byte)+"\r\n";
					//str_buf.Format("%s%s",buf,"\n");   //获取接受消息内容
				dlg->msg_record_str+=str_buf;
				dlg->msg_record.SetWindowTextA(dlg->msg_record_str);    //在窗口中显示
			}
		}
		
	ACE_Thread_Manager::instance ()->cancel_all ();
	ACE_Time_Value timeout2(30);
	ACE_Thread_Manager::instance()->wait(&timeout2);
	ACE::fini();
	return NULL;
	
}

void Cserver_mfcDlg::OnBnClickedConnect()   //客户端连接
{
	// TODO: 在此添加控件通知处理程序代码  ACE_LOCALHOST  "192.168.1.82"
	ACE::init();
	//UpdateData(FALSE);  //获取需要连接的对方的ip
	CString str_ip="";
	int client_port=0;
	remote_ip.GetAddress(remote_C_IP);
	con_port.GetWindowTextA(con_port_str);
	if(remote_C_IP==0)//如果没有输入指定连接ip,则默认192.168.1.171
	{
		str_ip="192.168.1.82";
	}
	else
	{
		remote_ip.GetAddress(remote_C_IP); //获取输入的ip
		str_ip.Format("%d.%d.%d.%d",(remote_C_IP>>24)&0xff,
			                        (remote_C_IP>>16)&0xff,
			                        (remote_C_IP>>8)&0xff,
									(remote_C_IP)&0xff);  
		
	}
	if(con_port_str=="")
	{
		client_port=10000;
	}
	else
	{
		client_port=_ttoi(con_port_str);
	}
	ClientAddr.set(client_port,str_ip);  //需连接对方服务器的ip  就是这里有问题
	//ACE_SOCK_Connector connector;
	ACE_Time_Value timeout(10,0);
	//ACE_SOCK_Stream str_send;
	ofstream logstream ("./error.log");  //输出错误信息
	
	//MessageBox("connection success!","connection tip");
	if(connector.connect(ClientPeer,ClientAddr,&timeout)==-1)
	{
		MessageBox("client connection failed!","connection tip");
		//logstream<<str_send;
		//log
		//int errorno;
		//strerror(errno);
		ACE_LOG_MSG->msg_ostream (&logstream);
		ACE_DEBUG((LM_INFO, ACE_TEXT ("some text\n")));//此处无输出
		logstream<<"test again\n";
		logstream<<strerror(errno);  //此处输出为no error
	}
	else
	{
		MessageBox("client connection success!","connection tip");
		//m_hThread_Client=CreateThread(NULL,100,Thread_Client,(void*)this,NULL,NULL);
		
		

	}
	

	ACE::fini();
	
}


__cc__ 2014-03-10
  • 打赏
  • 举报
回复
引用 12 楼 sunshine757961368 的回复:
[quote=引用 11 楼 neustar1 的回复:] [quote=引用 10 楼 sunshine757961368 的回复:] [quote=引用 9 楼 neustar1 的回复:] 1)你先确定一下,是否防火墙影响的; 2)tcp本身是可以跨越路由器的,之所以有的路由器跨越不了, 是因为端口映射导致的,很多台机器共用一个ip对外访问,其中使用不同的端口来区分,外部是不能直接连接内部的任何一个ip的。 你如果非要验证自己代码正确性,找个局域网的机器测试一下代码就知道可不可以了。 cmd指令之类的是没有的,与路由器配置有关系。
1、我两边的防火墙都关闭了,就是为了避免影响 2、我确定两台电脑没有任何端口映射 3、我们两个主机就是在一个局域网里面。。。[/quote] 你用的ip地址可以是“192.168.1.1”到“192.168.1. 254[/quote] 是,一个是192.168.1.171,一个是192.168.1.82[/quote] 如果这样的话,应该是可以连通的,你最好把代码贴上来看看
sunshine757961368 2014-03-10
  • 打赏
  • 举报
回复
引用 11 楼 neustar1 的回复:
[quote=引用 10 楼 sunshine757961368 的回复:] [quote=引用 9 楼 neustar1 的回复:] 1)你先确定一下,是否防火墙影响的; 2)tcp本身是可以跨越路由器的,之所以有的路由器跨越不了, 是因为端口映射导致的,很多台机器共用一个ip对外访问,其中使用不同的端口来区分,外部是不能直接连接内部的任何一个ip的。 你如果非要验证自己代码正确性,找个局域网的机器测试一下代码就知道可不可以了。 cmd指令之类的是没有的,与路由器配置有关系。
1、我两边的防火墙都关闭了,就是为了避免影响 2、我确定两台电脑没有任何端口映射 3、我们两个主机就是在一个局域网里面。。。[/quote] 你用的ip地址可以是“192.168.1.1”到“192.168.1. 254[/quote] 是,一个是192.168.1.171,一个是192.168.1.82
__cc__ 2014-03-10
  • 打赏
  • 举报
回复
引用 10 楼 sunshine757961368 的回复:
[quote=引用 9 楼 neustar1 的回复:] 1)你先确定一下,是否防火墙影响的; 2)tcp本身是可以跨越路由器的,之所以有的路由器跨越不了, 是因为端口映射导致的,很多台机器共用一个ip对外访问,其中使用不同的端口来区分,外部是不能直接连接内部的任何一个ip的。 你如果非要验证自己代码正确性,找个局域网的机器测试一下代码就知道可不可以了。 cmd指令之类的是没有的,与路由器配置有关系。
1、我两边的防火墙都关闭了,就是为了避免影响 2、我确定两台电脑没有任何端口映射 3、我们两个主机就是在一个局域网里面。。。[/quote] 你用的ip地址可以是“192.168.1.1”到“192.168.1. 254
sunshine757961368 2014-03-10
  • 打赏
  • 举报
回复
引用 9 楼 neustar1 的回复:
1)你先确定一下,是否防火墙影响的; 2)tcp本身是可以跨越路由器的,之所以有的路由器跨越不了, 是因为端口映射导致的,很多台机器共用一个ip对外访问,其中使用不同的端口来区分,外部是不能直接连接内部的任何一个ip的。 你如果非要验证自己代码正确性,找个局域网的机器测试一下代码就知道可不可以了。 cmd指令之类的是没有的,与路由器配置有关系。
1、我两边的防火墙都关闭了,就是为了避免影响 2、我确定两台电脑没有任何端口映射 3、我们两个主机就是在一个局域网里面。。。
__cc__ 2014-03-10
  • 打赏
  • 举报
回复
1)你先确定一下,是否防火墙影响的; 2)tcp本身是可以跨越路由器的,之所以有的路由器跨越不了, 是因为端口映射导致的,很多台机器共用一个ip对外访问,其中使用不同的端口来区分,外部是不能直接连接内部的任何一个ip的。 你如果非要验证自己代码正确性,找个局域网的机器测试一下代码就知道可不可以了。 cmd指令之类的是没有的,与路由器配置有关系。
sunshine757961368 2014-03-10
  • 打赏
  • 举报
回复
引用 7 楼 neustar1 的回复:
[quote=引用 6 楼 sunshine757961368 的回复:] [quote=引用 5 楼 neustar1 的回复:] [quote=引用 3 楼 sunshine757961368 的回复:] [quote=引用 1 楼 wulijian 的回复:] 两台电脑是一个内网的吗,不是一个内网的话不能直接连接,需要一个中间外网服务器
是一个内网,都能ping通的[/quote]能ping通,可不代表没跨越路由器,你试试ping www.163.com,照样能ping通,关键是不能跨越路由器。[/quote] 就是说,我两台主机之间不能有路由器??[/quote] 这句话不能这么确定,但是我看你的情况应该是由于路由器隔断导致的,集线器连接应该是没有问题的。[/quote] 哦~意思就是可能是路由器影响通信了,所以连接不上?。。。这样,那有什么方式能够确定是不是路由器的问题吗?cmd的指令什么的?
__cc__ 2014-03-10
  • 打赏
  • 举报
回复
引用 6 楼 sunshine757961368 的回复:
[quote=引用 5 楼 neustar1 的回复:] [quote=引用 3 楼 sunshine757961368 的回复:] [quote=引用 1 楼 wulijian 的回复:] 两台电脑是一个内网的吗,不是一个内网的话不能直接连接,需要一个中间外网服务器
是一个内网,都能ping通的[/quote]能ping通,可不代表没跨越路由器,你试试ping www.163.com,照样能ping通,关键是不能跨越路由器。[/quote] 就是说,我两台主机之间不能有路由器??[/quote] 这句话不能这么确定,但是我看你的情况应该是由于路由器隔断导致的,集线器连接应该是没有问题的。
sunshine757961368 2014-03-10
  • 打赏
  • 举报
回复
引用 5 楼 neustar1 的回复:
[quote=引用 3 楼 sunshine757961368 的回复:] [quote=引用 1 楼 wulijian 的回复:] 两台电脑是一个内网的吗,不是一个内网的话不能直接连接,需要一个中间外网服务器
是一个内网,都能ping通的[/quote]能ping通,可不代表没跨越路由器,你试试ping www.163.com,照样能ping通,关键是不能跨越路由器。[/quote] 就是说,我两台主机之间不能有路由器??
__cc__ 2014-03-10
  • 打赏
  • 举报
回复
引用 3 楼 sunshine757961368 的回复:
[quote=引用 1 楼 wulijian 的回复:] 两台电脑是一个内网的吗,不是一个内网的话不能直接连接,需要一个中间外网服务器
是一个内网,都能ping通的[/quote]能ping通,可不代表没跨越路由器,你试试ping www.163.com,照样能ping通,关键是不能跨越路由器。
sunshine757961368 2014-03-10
  • 打赏
  • 举报
回复
引用 2 楼 yifuzhiming 的回复:
失败的原因是什么,总有个报错吧
代码没有错误就没有报错啊,用try,catch也抓不出来,没有错误。。。
sunshine757961368 2014-03-10
  • 打赏
  • 举报
回复
引用 1 楼 wulijian 的回复:
两台电脑是一个内网的吗,不是一个内网的话不能直接连接,需要一个中间外网服务器
是一个内网,都能ping通的

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧