我觉得有两种做法
1:每次发之前告诉对方,要收多长
2:设置一个足够大的缓冲区,要求填满,直到超时为止
还有其他的办法吗?
这两种做法效率都大受影响啊!

解决方案 »

  1.   

    to lin_style : MTU差不多固定的吧,1500,可是recv/send通常不是这么大阿
    to akirya: "接收端只管收,然后解析".要先接受然后解析阿,而问题就是接受多长的数据呀?我就不知道该接受多少呀
    不知道HTTP是怎么实现的,因为虽然HTTP返回的时候可以带有Content-Length,但HTTP的客户端是如何保证能收到这个Content-Length字段呢?就算收到了,一开始的缓冲区如果设置太小,还要再调整大小再收一把,这样也很麻烦亚,因为会涉及到数据拷贝重新粘成块的问题
    唉,没想明白
      

  2.   

    HTTP头能有多长?开个1024的buffer,先把HTTP头收全,然后查contentlength,再继续收
      

  3.   

    如果HTTP头里没有contentlength,那就一边收一边写文件,收完之后再处理文件。
    recv()==0表示收完。
      

  4.   

    HTTP头到底能多长我也不知道呀
    不过好像是可扩展的,1024好像不一定够用吧
      

  5.   

    头部的结束符号是\r\n\r\n一边收一边查找吧
      

  6.   

    首先方法二是不可取得,如果没有约定,你就是填满也不知道是否收完了。所以不是效率问题,根本做不了
    这个问题一般有两种解法
    方法1和你说得一样,是最高效得方法(因为双方都知道有多少字节,不需要动态分析)
    方法2是双方约定一个通信格式,当约定得格式得到满足,则结束。可以用正则表达式分析,也可以用特定得结束符
    例如SMTP就靠0x0D 0x0A 0x2E 0x0D 0x0A 五个字符通知对方发送完成。由于需要分析字符串,效率比较低。
      

  7.   

    你这只对发完消息就关闭连接得情况有效(如不支持keep alive的HTTP),如果系统不是发送一个报文就关闭链路,为什么会recv()==0?
      

  8.   

    关键是不了解HTTP是怎么做的呢?他怎么把头收完的呐?
    总不能两个字节两个字节的首,收了就看是不是\r\n吧?
    这样的话,缓冲区也碎了,很麻烦呀....
      

  9.   

    第一,ip头和tcp头都有包或数据的长度
    第二,可以自定义数据格式,在数据的开始处,填写数据的长度
      

  10.   

    to: ouyh12345
    ip头和tcp头确实都有长度,但是这个长度HTTP看不到,自己建立的socket也看不到啊
    http协议除了content-length以外,没有填写数据长度的地方
    而且在收到content-length以前,HTTP头的长度也是变化的,可以很长