非阻塞 TCP 套接字并在发送后立即刷新?
不存在刷新 TCP 套接字这样的事情。
由于阻塞套接字不允许我控制连接超时
错误的。您可以使用select()
在阻塞套接字上。
我正在使用非阻塞的。
不合逻辑的推论。
发送命令后,我正在使用关闭命令来刷新(我必须这样做)。
你不必这样做,而且shutdown()
不冲洗任何东西。
我的超时是50ms
为什么?发送数据的时间取决于数据的大小。明显地。使用固定的发送超时没有任何意义。
我想知道的是,如果要发送的数据这么大,是否存在只发送部分数据或根本不发送数据的风险?
在阻止模式下,您提供给的所有数据send()
如果可能的话将被发送。非阻塞模式下,返回值代表的数据量send()
如果可能的话,将被发送。无论哪种情况,如果发送失败,连接都会重置。无论您叠加什么超时机制都不可能改变其中任何一个:具体来说,超时后异步关闭套接字只会导致将关闭附加到正在发送的数据中。它会not导致发送中止。
您的代码不会通过人类已知的任何代码审查。零错误检查;睡眠完全没有意义;并且在关闭之前关闭是多余的。如果睡眠旨在实现超时,则它不会。
我想尽快发送数据。
你不能。 TCP实现流量控制。你对此无能为力。您受到接收者的速率限制。
另外两种可能的情况是:服务器等待太长时间接受连接
没有这样的案例。客户端可以在服务器调用之前完成连接accept().
如果您尝试实现比默认值约一分钟更短的连接超时,请使用select().
或接收。
你对此无能为力:见上文。
因此,连接和写入都应该在最多 50 毫秒内完成,因为时间在我的情况下非常重要。
往上看。对于需要可变时间的操作实现固定超时是没有意义的。 50 毫秒对于连接超时来说太短了。如果这是一个真正的问题,您应该保持连接打开,以便连接延迟只发生一次:事实上,您应该尽可能长时间地保持 TCP 连接打开。
我必须刷新写入和读取流
你不能。 TCP 中没有任何操作会刷新读取流或写入流。
因为服务器不断向我发送不必要的大数据,而且我的互联网连接有限。
Another 不合逻辑的推论。如果服务器向您发送数据,您必须读取它,否则您将停止服务器,并且这与刷新您自己的写入流没有任何关系。
实际上我什至不想要来自服务器的单个字节
厄运。你必须阅读它。 [如果您使用的是 BSD Unix,您可以关闭输入套接字,这将导致来自服务器的数据被丢弃,但这在 Windows 上不起作用:它会导致服务器连接重置。]