http请求消息边界

http请求消息边界,http,tcp,webserver,httpclient,Http,Tcp,Webserver,Httpclient,我正在编写一个客户端,通过常规http多部分/表单数据将文件上载到megaupload。现在,重点不是megaupload本身,而是他们的Web服务器的行为 Curl可以毫无问题地上传,而我的客户端则不能,即使发送与wireshark嗅探的完全相同的请求——但它一直在等待响应,最终在30分钟后超时 在使用原始套接字和strace一段时间后,发现两者之间的唯一区别是curl只发送一个对sendto2的调用的头块,然后发送其他对sendto2的调用的头块。另一方面,我的客户机用write2分别发送每

我正在编写一个客户端,通过常规http多部分/表单数据将文件上载到megaupload。现在,重点不是megaupload本身,而是他们的Web服务器的行为

Curl可以毫无问题地上传,而我的客户端则不能,即使发送与wireshark嗅探的完全相同的请求——但它一直在等待响应,最终在30分钟后超时

在使用原始套接字和strace一段时间后,发现两者之间的唯一区别是curl只发送一个对sendto2的调用的头块,然后发送其他对sendto2的调用的头块。另一方面,我的客户机用write2分别发送每个头

现在,sendto和write应该是等价的,如果send没有指定任何标志,而且它没有指定。事实上,我使用write实现了这一功能,但这只是通过在一次调用中发送头块实现的。每隔一个写调用序列就会导致请求被卡在等待中

所以问题是:这怎么可能?Tcp不保留消息边界,它是一种流协议

我唯一能想到的是,每次写/发送系统调用都会导致发送一个数据包,而远程服务器正在嗅探原始数据包并谎称自己是apache

想法?还是说我是个白痴,这是兼容http服务器的正常行为?
它肯定是第一个对我这样做的Web服务器。

http协议包含一些机制,以便客户端/服务器可以确定消息边界。 对于上传的数据帖子,需要输入内容长度请求头或分块编码。内容长度让服务器确切地知道从套接字接收多少字节。一旦收到这些字节,它就会向另一个方向发送。这实际上就是这里的信息边界。分块编码还告诉服务器有多少字节;就几块


对于响应,内容长度或分块编码是可选的。这还告诉客户端预期的字节数;这是持久连接工作所必需的。如果无法确定内容长度,服务器只需关闭套接字,那么客户端就知道它有整个响应:

http协议包含一些机制,以便客户端/服务器可以确定消息边界。 对于上传的数据帖子,需要输入内容长度请求头或分块编码。内容长度让服务器确切地知道从套接字接收多少字节。一旦收到这些字节,它就会向另一个方向发送。这实际上就是这里的信息边界。分块编码还告诉服务器有多少字节;就几块


对于响应,内容长度或分块编码是可选的。这还告诉客户端预期的字节数;这是持久连接工作所必需的。如果无法确定内容长度,服务器只需关闭套接字,客户端就知道它有完整的响应:

指向http和tcp之间差异的问题。我认为所有http请求头都应该在一条tcp消息中。尝试访问web服务器的调试错误日志

指出http和tcp之间差异的问题。我认为所有http请求头都应该在一条tcp消息中。尝试访问web服务器的调试错误日志

我知道,但这根本不是我要问的。那么也许你应该澄清你的确切问题:你问的是http消息边界,我给了你一个试图解释http消息边界的答案。一端的send/sendto等与另一端的recv等之间没有一对一的通信。我知道,但这根本不是我要问的。那么也许你应该澄清你的确切问题:你问的是http消息边界,我给了你一个试图解释http消息边界的答案。一端的发送/发送收件人等与另一端的recv等之间没有一对一的通信。