MFC 网络聊天+文件传输
这似乎已经是一个很原始的话题了。
学网络编程不久,聊天和传文件的范例都能看得明白。当下要做一个程序,有七百客户端,需要传不少文件,都是音视频类的,也有聊天需求,群聊、私聊,七百用户,您知道的!
1.看到一个例子,里面自己搞个数据结构(结构体),算是数据包头,描述的是数据类型(文件)、数据大小、发送状态,云云,数据包到了客户端再拆包,分析,组合,云云,用的是SOCKET STREAM连接,也就是TCP啦。这例子能随时监听发送状态,得知发送进度,还自带反馈确认机制,挺时尚的样子。
2.又看到个例子,直接上TCP,那边读文件发送,这边接收写文件。完事。
我在想,例子1里的确认机制,TCP不是有么?TCP依然保证可靠传输,何须再确认!这得多低效。我如果用例子2的方案,顶多,少个进度条,少个中途“取消发送”(我主要传送音频,几个M的文件貌似少这个无伤大雅)。但新手,还是劳烦大虾多给点意见。
嗯,到聊天一块。
聊天一块,那么多用户,我首先想到UDP,但是如果发送了出去,对方没接收到这边也没重传确是个问题,至少QQ会告诉你发送失败,要知道发送失败就需要确认,这干的貌似还是TCP的活啊(少了连接)。如果用TCP,七百个TCP连接不放(或许未必只七百个),貌似也不小了,服务器吃不吃得下是个问题。
对于群聊,貌似就是一客户端发来消息,然后服务端转发给其他所有在线客户端,这让我不禁想到ICMP组播攻击(以一个攻击目标为源地址组播ping一个两百台的目标网络,然后目标网络回发200条回复到攻击目标),这赤裸裸的极其相像,只是数据方向相反罢了。首先想到的是组播,但是貌似需要路由器支持啊,据说互联网上不适用。如此,假如采用UDP加确认,那客户端随便一条消息就足以放大1400倍!(以七百客户端算),这让我不知如何是好。
SOCKET用的生疏,还望大家见谅啊,这里问个也许很幼稚的问题。假如不添加包头区分数据类型,如何区分接收到的数据是聊天内容还是文件数据呢?我先想到的是用不同的SOCKET,一个用以聊天,一个用以传文件,但是却不知道在接收端如何区分不同的SOCKET(据说是根据WPARAM,但具体操作却不得知)。如果我想要拥有全局聊天功能兼拥有私聊功能,那或许就需要区分不同用户的SOCKET,服务端能有这个区分吗?还是必须要添加包头,然后在包头添加用户信息呢?
先谢!