• 6900阅读
  • 5回复

新人共享(一步一印) [复制链接]

上一主题 下一主题
离线mysuli312
 
只看楼主 倒序阅读 楼主  发表于: 2009-03-18
我是新人

高手如果觉得我说的东西菜,请绕路;
    如果觉得我说的某些地方有问题,请指正;
    如果觉得我说的某些地方值得探讨,请留下宝贵意见.
我在做C/S,QT用做客户端

因为尝到新人的难处,就把遇到的并已经解决的问题发出来
为其他新生方便,也为自己以后找资料方便。此贴会在一段时间内保持更新。

main函数里创建了主窗体

主窗体(mainWindow)隐藏
主窗体里动态创建了一个子窗体(childWindow)

这时候,子窗体不会出现在任务栏里
原因现在还没弄清楚,自己有猜测,但觉得不可靠,就不乱说了
这种情况,把子窗体的句柄提交给应用程序对象,
让他成为主窗体的兄弟窗体,就会出现在任务栏里了。
在mainWindow创建childWindow后,加上
childWindow->setParent((QWidget*)this->parent())
childWindow->show()
离线mysuli312
只看该作者 1楼 发表于: 2009-03-19
P2P原理
这是找到的资料,不敢冒充原作。给出地址
http://www.qqgb.com/Program/VC/VCnet/Program_158819.html

下面是P2P实现的关键,发出来

我们先假设一下:有一个服务器S在公网上有一个IP,两个私网分别由NAT-A和NAT-B连接到公网,NAT-A后面有一台客户端A,NAT-B后面有一台客户端B,现在,我们需要借助S将A和B建立直接的TCP连接,即由B向A打一个洞,让A可以沿这个洞直接连接到B主机,就好像NAT-B不存在一样。
实现过程如下(请参照源代码):
1、 S启动两个网络侦听,一个叫【主连接】侦听,一个叫【协助打洞】的侦听。
2、 A和B分别与S的【主连接】保持联系。
3、 当A需要和B建立直接的TCP连接时,首先连接S的【协助打洞】端口,并发送协助连接申请。同时在该端口号上启动侦听。注意由于要在相同的网络终端上绑定到不同的套接字上,所以必须为这些套接字设置 SO_REUSEADDR 属性(即允许重用),否则侦听会失败。
4、 S的【协助打洞】连接收到A的申请后通过【主连接】通知B,并将A经过NAT-A转换后的公网IP地址和端口等信息告诉B。
5、 B收到S的连接通知后首先与S的【协助打洞】端口连接,随便发送一些数据后立即断开,这样做的目的是让S能知道B经过NAT-B转换后的公网IP和端口号。
6、 B尝试与A的经过NAT-A转换后的公网IP地址和端口进行connect,根据不同的路由器会有不同的结果,有些路由器在这个操作就能建立连接(例如我用的TPLink R402),大多数路由器对于不请自到的SYN请求包直接丢弃而导致connect失败,但NAT-A会纪录此次连接的源地址和端口号,为接下来真正的连接做好了准备,这就是所谓的打洞,即B向A打了一个洞,下次A就能直接连接到B刚才使用的端口号了。
7、 客户端B打洞的同时在相同的端口上启动侦听。B在一切准备就绪以后通过与S的【主连接】回复消息“我已经准备好”,S在收到以后将B经过NAT-B转换后的公网IP和端口号告诉给A。
8、 A收到S回复的B的公网IP和端口号等信息以后,开始连接到B公网IP和端口号,由于在步骤6中B曾经尝试连接过A的公网IP地址和端口,NAT-A纪录了此次连接的信息,所以当A主动连接B时,NAT-B会认为是合法的SYN数据,并允许通过,从而直接的TCP连接建立起来了。
离线wvins
只看该作者 2楼 发表于: 2009-03-19
先谢谢楼主了,如果有结合Qt的开发不是更好么?
离线mysuli312
只看该作者 3楼 发表于: 2009-03-19
引用第2楼wvins于2009-03-19 09:08发表的  :
先谢谢楼主了,如果有结合Qt的开发不是更好么?


我正在做QT的P2P,因为对QT了解不深,都是一步一坑趴着走的
这个P2P实现后,我把原码会发出来
离线wd007

只看该作者 4楼 发表于: 2009-03-19
顶一下,开源精神的实践者!
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
离线jing51536
只看该作者 5楼 发表于: 2010-05-16
我也正在做,,,期待....
快速回复
限100 字节
 
上一个 下一个