http 响应的最大大小是多少?
What is the maximum size of an http response?
我正在创建一个 HTTP 下载管理器,我在 c# 中使用纯套接字。
我不知道在每个 网络流读取 函数中我应该读取多少 HTTP 数据。
如果我读到大约1024字节,没关系。
但我想知道如何计算出每次读取有多少数据可用?
这是我正在使用的代码
try
{
if (port == 443)
sslStream.Read(buffer, current_read, buffer.Length);
else
netStream.Read(buffer, current_read, buffer.Length);
}
catch (Exception ex)
{
Console.WriteLine("disconnected , can't read from stream");
return;
}
当socket中有数据时stream的read函数才会起作用。但没有提到缓冲区大小。我的意思是我应该将缓冲区长度设置为 tcp 协议最大数据包大小 (64KB) 吗?
HTTP 规范没有对帖子/Get 施加特定的大小限制。它们通常会受到 Web 服务器或用于处理表单提交的编程技术的限制。
TcpClient.Available
https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.tcpclient.available?view=net-5.0
获取已从网络接收并可供读取的数据量。
Available 属性 是一种确定数据是否排队等待读取的方法。如果数据可用,调用 Read 获取数据。可用数据是网络缓冲区中排队等待读取的数据总量。如果网络缓冲区中没有数据排队,可用 returns 0.
如果远程主机关闭或关闭连接,Available 可能会抛出 SocketException。如果收到 SocketException,请使用 SocketException.ErrorCode 获取特定的错误代码。获取此代码后,您可以参考 Windows Sockets version 2 API 错误代码文档以获得详细的错误描述。
参考是:
https://referencesource.microsoft.com/#system/net/system/net/Sockets/Socket.cs
第 345 行
这是对操作系统dll文件的另一个调用,我猜它们是C或C++语言。
这是在c#中实际调用的方法。 UnsafeNclNativeMethods.OSSOCK.ioctlsocket
/// <devdoc>
/// <para>
/// Gets the amount of data pending in the network's input buffer that can be
/// read from the socket.
/// </para>
/// </devdoc>
public int Available {
get {
if (CleanedUp) {
throw new ObjectDisposedException(this.GetType().FullName);
}
int argp = 0;
// This may throw ObjectDisposedException.
SocketError errorCode = UnsafeNclNativeMethods.OSSOCK.ioctlsocket(
m_Handle,
IoctlSocketConstants.FIONREAD,
ref argp);
GlobalLog.Print("Socket#" + ValidationHelper.HashString(this) + "::Available_get() UnsafeNclNativeMethods.OSSOCK.ioctlsocket returns errorCode:" + errorCode);
//
// if the native call fails we'll throw a SocketException
//
if (errorCode==SocketError.SocketError) {
//
// update our internal state after this socket error and throw
//
SocketException socketException = new SocketException();
UpdateStatusAfterSocketError(socketException);
if(s_LoggingEnabled)Logging.Exception(Logging.Sockets, this, "Available", socketException);
throw socketException;
}
return argp;
}
}
我正在创建一个 HTTP 下载管理器,我在 c# 中使用纯套接字。
我不知道在每个 网络流读取 函数中我应该读取多少 HTTP 数据。
如果我读到大约1024字节,没关系。
但我想知道如何计算出每次读取有多少数据可用?
这是我正在使用的代码
try
{
if (port == 443)
sslStream.Read(buffer, current_read, buffer.Length);
else
netStream.Read(buffer, current_read, buffer.Length);
}
catch (Exception ex)
{
Console.WriteLine("disconnected , can't read from stream");
return;
}
当socket中有数据时stream的read函数才会起作用。但没有提到缓冲区大小。我的意思是我应该将缓冲区长度设置为 tcp 协议最大数据包大小 (64KB) 吗?
HTTP 规范没有对帖子/Get 施加特定的大小限制。它们通常会受到 Web 服务器或用于处理表单提交的编程技术的限制。
TcpClient.Available
https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.tcpclient.available?view=net-5.0
获取已从网络接收并可供读取的数据量。
Available 属性 是一种确定数据是否排队等待读取的方法。如果数据可用,调用 Read 获取数据。可用数据是网络缓冲区中排队等待读取的数据总量。如果网络缓冲区中没有数据排队,可用 returns 0.
如果远程主机关闭或关闭连接,Available 可能会抛出 SocketException。如果收到 SocketException,请使用 SocketException.ErrorCode 获取特定的错误代码。获取此代码后,您可以参考 Windows Sockets version 2 API 错误代码文档以获得详细的错误描述。
参考是: https://referencesource.microsoft.com/#system/net/system/net/Sockets/Socket.cs
第 345 行
这是对操作系统dll文件的另一个调用,我猜它们是C或C++语言。
这是在c#中实际调用的方法。 UnsafeNclNativeMethods.OSSOCK.ioctlsocket
/// <devdoc>
/// <para>
/// Gets the amount of data pending in the network's input buffer that can be
/// read from the socket.
/// </para>
/// </devdoc>
public int Available {
get {
if (CleanedUp) {
throw new ObjectDisposedException(this.GetType().FullName);
}
int argp = 0;
// This may throw ObjectDisposedException.
SocketError errorCode = UnsafeNclNativeMethods.OSSOCK.ioctlsocket(
m_Handle,
IoctlSocketConstants.FIONREAD,
ref argp);
GlobalLog.Print("Socket#" + ValidationHelper.HashString(this) + "::Available_get() UnsafeNclNativeMethods.OSSOCK.ioctlsocket returns errorCode:" + errorCode);
//
// if the native call fails we'll throw a SocketException
//
if (errorCode==SocketError.SocketError) {
//
// update our internal state after this socket error and throw
//
SocketException socketException = new SocketException();
UpdateStatusAfterSocketError(socketException);
if(s_LoggingEnabled)Logging.Exception(Logging.Sockets, this, "Available", socketException);
throw socketException;
}
return argp;
}
}