你调用write和read都是用户自己写入的数据,write时候IP协议栈自动加入IP(TCP or UDP)头部,read的时候IP协议栈会自动去掉IP(TCP or UDP)头部,因此你write的数据在对端受到的时候还是你写入的数据。头部的问题对是透明的。即使IP的分片和重组也是由IP协议栈为你做的,这些你都不需要考虑,唯一考虑的就是你要发送的数据区域。
因为头部对你透明,所以你即使加密也只能加密你发送的数据,但是就如我下面提到的因为TCP读的时候是流读取,所以数据区自己要加入一个自己定义的报头,最简单的就是一个len,所以len是不能加密的,len后面跟的buffer是可以加密的。
要弄清楚UDP是数据报文,而TCP是流数据报文。
两者区别如下:
(1) UDP你可以用read一次读入一个包,而且返回的也就是一个包。
比如同时到了p1p2两个报,你可以分两次read读,每次返回一个报。
(2)而TCP是不一样的,就是流数据报文,read返回的是尽量多的数据报,可能是多个。
比如同时到了p1p2两个报,你一次read就能把两个全读了,因此需要自己在tcp的数据区定义头部,数据 (long)len + buffer 格式, 先使用read(长度4byte)读出数据的长度len,然后再根据len,读取后面buffer的数据 read(ntohl(len)); 这样才能读取一个完整的数据报,就是通常的两次读。
[广告] 金秋最关注楼盘-房不胜房