全国:13392411270
这次的项目题目是linux下的系统和网络编程,要求我用c语言设计出一个网络视频点播功能的程序。该项目我是用服务器与客户端的网络连接完成的。以下是具体的实现过程:
1.采用tcp协议连接,这种通信方式比较稳定,而且是具体的一对一模式,这样保证客户端接收数据的稳定性,udp虽然也可以用在这里,但是udp较tcp有较大的不稳定性,考虑到这个项目中服务器和客户端的交互过程单一,因此用tcp牺牲一点效率换来数据的稳定传输是比较好的。
2.客户端的功能是注册、登录、修改密码、查看和播放视频。这些功能均采用同一种数据处理方式,即向服务器发送请求,每一种功能都有不一样的标记符号,服务器在接收到标记符号后判断后续的操作并返回客户端需要的信息。比如注册:在客户端发送“reg”标记后,服务器跳转到“reg”处理函数,读取所有客户端文件,并形成结构体链表,一个一个比对之后确定客户端的姓名不重复,将注册人姓名添加进链表,然后更新客户端文件,并返回客户端一个注册成功的标志,客户端此时就可以根据返回标记提示操作者是否注册成功。其他功能都是这样的一个处理过程。
3.播放视频这个功能中需要调用一次mplayer系统调用,这里需要注意的是服务器的发送数据大小要跟客户端的接收数据大小一致,不然很容易出现数据错位的。后来在于小组讨论过之后,发觉其实并不需要每次传输都确定大小,用一个int类型的变量接收到read函数返回值后,打印出ret个数据就可以了,这样可以做到动态更改接收和发送数据大小的功能。
4.全部功能实现之后,我尝试了一下在tcp协议下多进程的单聊功能,我的想法是客户端1将聊天内容发送给服务器然后再由服务器转发给客户端2,由于我的服务器是多进程做的,这里就需要用到一个进程间通讯的知识点,查询了大量资料以及不断的实验改良之后,决定了用信号和共享内存在实现转发的功能,这个过程是非常麻烦的,最后做的有点乱,只能实现客户端1向客户端2发送信息,而客户端2却不能发给客户端1。最后实在弄不清楚了,估计就是在进程通讯这里代码写的有些乱。
不足之处,上边提到的注册和登录等功能都是通过文件的写入和读取来做的,其实这样是很没有效率的,应该好好利用内存的思想,用内存来操作这个过程会效率很高,而且对硬盘的伤害也不大,还有就是进程之间对共享内存或者文件的读写没有加上互斥机制,最后就是进程通讯还是太麻烦了,以后尽量多使用线程来做。
以上的不足我会在课余时间自己弥补。