请教关于局域网内无服务器的点对点通讯问题
我正在做一个模块,是一个局域网的点对点传送文件,发消息的模块,并且是没有服务器的。
目前假设有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时间片。。
总的说,这个模块,在对于只有两台主机(包括自己)的情况下是比较稳定的,主机一多,各种不稳定都出现了。。
请教大侠啊!