确确的说,应该是“什么是tcp通讯”。我不说严谨的学术定义,其实我那学历水平也说不出来,嘿嘿。网络通讯嘛,其实两个socket连接就OK了,是吗?!过去这么多年,处理解决了很多tcp通讯的问题,是应该写点东西了,要不然这个博客就沉陷下去了。
先看看这小段代码:
......
Send(s, buf1, len1, 0);
Send(s, buf2, len2, 0);
CloseSocket(s);
一般情况下,这段代码是没有问题的。堵塞Send返回之后,基本上可以很有把握的说数据已经达到了对方的Socket底层,但是值得注意的是:也仅仅是到达socket底层而已,并不意外着一定到达了对方的应用层。对于重要的数据传输,这不是严谨的,因为我们无法保证在应用层获得数据之前一切都是正常的,更不能保证CloseSocket之后对方的socket底层还能有效保留数据等待应用层读取(尽管你是使用Recv堵塞读取数据,其实socket底层也是异步和多线程的)。
重要的数据通讯,需要具有这样的协议要求:连接握手,应答机制,心跳维持,优雅断开。连接握手:可能需要交换验证信息等,服务器需要确定合法的连接。应答机制:保证了数据100%达到对方的应用层或已经被对方处理了。心跳维持:可以让服务器避免出现由于空或假连接导致耗尽服务器资源的情况(切记,它是保护服务器端,因此一定是由客户端发送)。优雅断开:这是确保数据已经都发送到了对方的应用层,对方也已经回复了断开请求。
其实我也写喜欢堵塞,我也喜欢传输一个文件开一个连接,不用定义这么多的协议指令......
晚了困了,网线和路由是网络的有形部分,socket(TCP/IP)是网络的无形部分,那些复杂的应用层协议指令才是通讯的生命部分。