to lin_style : MTU差不多固定的吧,1500,可是recv/send通常不是这么大阿 to akirya: "接收端只管收,然后解析".要先接受然后解析阿,而问题就是接受多长的数据呀?我就不知道该接受多少呀 不知道HTTP是怎么实现的,因为虽然HTTP返回的时候可以带有Content-Length,但HTTP的客户端是如何保证能收到这个Content-Length字段呢?就算收到了,一开始的缓冲区如果设置太小,还要再调整大小再收一把,这样也很麻烦亚,因为会涉及到数据拷贝重新粘成块的问题 唉,没想明白
to akirya: "接收端只管收,然后解析".要先接受然后解析阿,而问题就是接受多长的数据呀?我就不知道该接受多少呀
不知道HTTP是怎么实现的,因为虽然HTTP返回的时候可以带有Content-Length,但HTTP的客户端是如何保证能收到这个Content-Length字段呢?就算收到了,一开始的缓冲区如果设置太小,还要再调整大小再收一把,这样也很麻烦亚,因为会涉及到数据拷贝重新粘成块的问题
唉,没想明白
recv()==0表示收完。
不过好像是可扩展的,1024好像不一定够用吧
这个问题一般有两种解法
方法1和你说得一样,是最高效得方法(因为双方都知道有多少字节,不需要动态分析)
方法2是双方约定一个通信格式,当约定得格式得到满足,则结束。可以用正则表达式分析,也可以用特定得结束符
例如SMTP就靠0x0D 0x0A 0x2E 0x0D 0x0A 五个字符通知对方发送完成。由于需要分析字符串,效率比较低。
总不能两个字节两个字节的首,收了就看是不是\r\n吧?
这样的话,缓冲区也碎了,很麻烦呀....
第二,可以自定义数据格式,在数据的开始处,填写数据的长度
ip头和tcp头确实都有长度,但是这个长度HTTP看不到,自己建立的socket也看不到啊
http协议除了content-length以外,没有填写数据长度的地方
而且在收到content-length以前,HTTP头的长度也是变化的,可以很长