我正在做一个模块,是一个局域网的点对点传送文件,发消息的模块,并且是没有服务器的。
目前假设有A,B两台主机,A,B主机每3秒会发送一次广播包(255.255.255.255),通知所有机子我们的存在,当B主机收到广播包,分析包内容是A主机发出的,则把A主机加入到B的在线用户列表,对于A也同样。这样就实现了一个“发现用户”的功能。然后A,B主机在发现完对方后,就已经有了对方的IP地址和TCP监听端口号了(这些数据包含在广播包里),即已经可以互相传送文件,发送消息了。但是目前存在几个问题:
1.当局域网内出现多台主机(使用了我这个模块的主机),传送文件,发送消息之类的会变得不稳定,具体表现为传送过程中卡死之类的,跟踪之后错误也莫名奇妙。会不是发送广播包太频繁了?如果是这样,“发现用户”机制怎样弄,因为要考虑到及时性,不能A主机开了半天,B主机还没看到A主机。
2.退出机制,目前模块里有心跳包检测,在1分钟内,收不到某个主机的心跳包,则认为退出,这个正常。但是当程序退出时,模块会给“在线用户列表”的每个用户发送一个TCP包,通知他们本机要下线了,然后程序就退出了。这个过程很快,可能是刚刚send完后,程序就退出了,不知道有什么好办法,可以便得发送完退出包后再退出程序?
3.还有一个就是传送文件,假设现在有A,B,C,D,E五台主机,B,C,D,E主机同时向A主机主求不同的文件,A主机对应每个传送请求会另外创建一个线程来处理,但是这时A主机会变得很卡(机器性能还可以啦),是不是执行的事情太多了?有考虑过可以每传固定大小的数据后都sleep一下?但是sleep还是占用CPU时间片。。总的说,这个模块,在对于只有两台主机(包括自己)的情况下是比较稳定的,主机一多,各种不稳定都出现了。。请教大侠啊!
目前假设有A,B两台主机,A,B主机每3秒会发送一次广播包(255.255.255.255),通知所有机子我们的存在,当B主机收到广播包,分析包内容是A主机发出的,则把A主机加入到B的在线用户列表,对于A也同样。这样就实现了一个“发现用户”的功能。然后A,B主机在发现完对方后,就已经有了对方的IP地址和TCP监听端口号了(这些数据包含在广播包里),即已经可以互相传送文件,发送消息了。但是目前存在几个问题:
1.当局域网内出现多台主机(使用了我这个模块的主机),传送文件,发送消息之类的会变得不稳定,具体表现为传送过程中卡死之类的,跟踪之后错误也莫名奇妙。会不是发送广播包太频繁了?如果是这样,“发现用户”机制怎样弄,因为要考虑到及时性,不能A主机开了半天,B主机还没看到A主机。
2.退出机制,目前模块里有心跳包检测,在1分钟内,收不到某个主机的心跳包,则认为退出,这个正常。但是当程序退出时,模块会给“在线用户列表”的每个用户发送一个TCP包,通知他们本机要下线了,然后程序就退出了。这个过程很快,可能是刚刚send完后,程序就退出了,不知道有什么好办法,可以便得发送完退出包后再退出程序?
3.还有一个就是传送文件,假设现在有A,B,C,D,E五台主机,B,C,D,E主机同时向A主机主求不同的文件,A主机对应每个传送请求会另外创建一个线程来处理,但是这时A主机会变得很卡(机器性能还可以啦),是不是执行的事情太多了?有考虑过可以每传固定大小的数据后都sleep一下?但是sleep还是占用CPU时间片。。总的说,这个模块,在对于只有两台主机(包括自己)的情况下是比较稳定的,主机一多,各种不稳定都出现了。。请教大侠啊!
解决方案 »
- 急!!BCGControlBar中CBCGPAutoHideDockBar、CBCGPAutoHideToolBar以及CBCGPSlider之间是什么关系……
- 我想仿个雷达界面:有一根指针带着余辉在界面扫描,请问怎么做
- 创建控件问题
- 如何判断一个指针有没有赋过值?200分相送
- 有什么办法让网页zoom in,zoom out的办法呀
- WIN2000下,相对端口0xCFC, 0xCF8操作,应该使用什么函数?
- 线程锁是不是就是互斥锁
- 如何使MDI程序一开始不出现新窗口?
- 最基本的问题,请高手回答
- CPoint问题,等效的表述,画图不一样不知道为什么?
- CListCtrl的双击事件::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult)中,最后一个参数怎么用啊
- 请教:如何设置CTreeCtrl单项高度?
可能不是用TCP模拟测试能解决,因为“发现机制”是通过每3秒发送广播包来实现的,这样当网内有多台机子以这样频率发送广播包,可能会出现网络堵塞的问题。。
我理解得比较简单,就是对255.255.255.255或具体网段的255地址发送包,就可以发送广播包。之前也有搜索过相关的信息,指出过多的广播包,可能会导致网络堵塞,但是如果不通过广播包来实现“发现机制”,又应该怎样实现?
反正是开源的下一个IPMsg的源码研究看看喽