socket开发中一个小问题
首先声明,本人是C开发方面的菜鸟,目前正在努力学习中,所以哪位高手看到本文所提的问题很弱智,莫要嘲笑! 此文没有什么高明的算法,只作为自己学习过程的一个笔记,总结经验,提醒自己而已!
最近本人在学习Linux下的socket编程,要实现一个文件传输的程序。client端发送文件,server端接收文件。发送接收函数用的是send(),recv(),文件读写用的是fread(),fwrite()函数。
我首先模仿一个现成的文件传输程序,写发送程序和接收程序。结果程序在运行过程中老是卡在那儿不动。我用gdb调试,发现server接收端在文件接收完之后一直阻塞在recv()函数,似乎一直在等待接收数据,而client发送端也阻塞在recv()函数。
这下我发现了问题所在,原来我打算在server端文件接收完之后,发送一个确认信息,client端接收到确认信息之后就结束。问题来了,client发送端肯定先知道文件已发送完了,只要从文件里读不出信息就可以了。但是server接收端不知道啊,它还在傻乎乎的等待接收信息。client端发送完之后也在傻乎乎的等待接收完毕确认信息。双方都在等待接收。这下双方都阻塞了。这是设计流程的错误!
所以,以后设计socket通信程序,信息发送完毕的信号一定要发送端首先发送,接收端之后才能确认接收完毕。