求教如何用socket实现跨局域网如何通信???

sxj0384 2011-02-25 10:33:57
最近正在学习vc网络编程用socket编了一个udp网络聊天程序
可是发现它只能进行局域网通信 和外网就朋友聊天就不行了

怎样实现不同局域网之间的通信???模型如下:
user1-----------------LAN1---------------------Internet----------------------------------LAN2----user2

就是如何用socket实现user1和user2之间的通信???

大侠们请指教,小弟感激不尽!!!
...全文
1124 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
fujialin2011 2011-02-28
  • 打赏
  • 举报
回复
此问题还得从局域网上网的方式说起,分为通过代理和非代理的形式,通过打洞来实现非代理的形式很容易实现,而代理涉及到协议,有HTTP代理、SOCKS5代理等,具体连接需要和协议协商,这个实现本人正在做。。。,要是有高手解决过,希望不吝赐教!
ga6840 2011-02-27
  • 打赏
  • 举报
回复
归根结蒂还是NAT的Session机制引起的问题,如果不租服务器,可以通过STUN服务器获得自己的公网入口
dong364 2011-02-27
  • 打赏
  • 举报
回复 1
也不一定非得打洞,如果你用的都是外网的IP当然都是可以的,之所以出现打洞,都是因为有内网IP,路由器不路由转发内网的数据包,关于打洞或穿透一说,楼主可以参考下p2p原理,网上很多
向立天 2011-02-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sxj0384 的回复:]

谢谢啊 了解一点了
服务器的话 网上那些免费的ftp空间可以算是服务器吗?
[/Quote]不可以
这里所说的服务器不单单指一个机器
而是在一个具有公网IP的机器上运行的程序
kulong0105 2011-02-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 testmfc 的回复:]
二楼的,你的服务端都没监听,客户端也没连接怎么通信嘛?
[/Quote]

UDP协议通信,服务器端不需要监听,客户端也不需要连接,可以直接接受和发送数据。
向立天 2011-02-26
  • 打赏
  • 举报
回复
想实现跨局域网通信要通过一个公网上的服务器做中继
QQ不也是有服务器的么
也就是说你的服务器必须有公网IP
重庆Debug 2011-02-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sxj0384 的回复:]

怎么没人回啊 哪位大侠能指导下,谢谢了!!
[/Quote]
我最近转了一篇好文章,就是有关于你说的 UDP/TCP 穿透打洞的文章,到我空间去看看吧。
似乎是需要一台服务端在互联网上作为中介的呢。。。所以至少需要三台电脑,在网络实验室做这个实验比较好,用一个交换机和一个路由器及三台电脑。
315539570.qzone.qq.com
我也正在学习穿透socket 编程。
欢迎一起讨论。
sxj0384 2011-02-26
  • 打赏
  • 举报
回复
怎么没人回啊 哪位大侠能指导下,谢谢了!!
sxj0384 2011-02-26
  • 打赏
  • 举报
回复
谢谢啊 了解一点了
服务器的话 网上那些免费的ftp空间可以算是服务器吗?
testMFC 2011-02-26
  • 打赏
  • 举报
回复
二楼的,你的服务端都没监听,客户端也没连接怎么通信嘛?
jwybobo2007 2011-02-26
  • 打赏
  • 举报
回复
1.公网有一个服务器,你们都通过这台服务器通信
2.你本身不是处于lan中,而是直接具有一个公网IP地址,此时对端通过IP可连接你
3.一端通过路由器作DMZ映射到公网上,等于拥有了公网IP然后通信,此时对端通过公网IP能访问你
4.打洞,前提是你在公网有一个服务器
...
sxj0384 2011-02-25
  • 打赏
  • 举报
回复
什么是打洞?怎么实现?
二楼的你的代码也是孙鑫的吧
呵呵,这只能进行局域网通信的
估计你没填上ip吧
horizonjjjj 2011-02-25
  • 打赏
  • 举报
回复
太好啦,楼主我也在学习socket呢,但我的服务器端为什么收不到客户端的信息呢,怎么回事,能帮我看一下吗?
//UDP服务器端:
#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));

SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
char recvBuf[100];

recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
printf("%s/n",recvBuf);
closesocket(sockSrv);
WSACleanup();


}
//UDP客户端:
#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=(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);

sendto(sockClient,"Hellow",strlen("Hellow")+1,0,
(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
closesocket(sockClient);
WSACleanup();

}
xengine-qyt 2011-02-25
  • 打赏
  • 举报
回复
。。。两个局域网,要么你打洞,要么你把你IP映射到外网

18,363

社区成员

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

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