在C套接字编程中刷新套接字流

我想知道在C语言中进行套接字编程时如何刷新套接字流。我尝试了所有选项 – 使用以下代码设置TCP_NODELAY

 setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(int)); 

注意:所有flagsockfd都被正确声明。

我在send( )之前和send( )之后使用了这个函数,但它没有任何区别。

还有人建议在每个send()之后使用shutdown() ,但这只适用于一个实例。 当我使用它再次发送一些文本时,它不起作用 – 实际上我使用shutdown()后连接被关闭。

 shutdown(sockfd, SHUT_WR); 

有人可以在这方面提供帮助吗?

我想补充一点 – 服务器是Java套接字,客户端是C套接字。 C套接字实现JVMTI接口并将信息发送到Java套接字。

您可能想阅读最终的SO_LINGER页面,或者:为什么我的tcp不可靠 ,我认为这适用于您的情况。

编辑:

多次在TCP套接字上调用send()并不常见:)这是正常的用法,我的意思是。 您可能在服务器端遇到问题,服务器需要一定数量的字节和块等待它。
据我所知,JVM TI并没有规定任何线上协议,所以你必须拿出自己的协议。 定义客户端发送的记录和服务器所期望的结构,如果大小不同则将数据长度放在那里。 您还可以从服务器返回到客户端实现一些应用程序级别的确认。

对Google进行一些研究,似乎没有办法明确地刷新套接字流。 您可以设置TCP_NODELAY,然后它将关闭TCP Nagle算法 。 这应该确保数据立即发送,而不是等到它的缓冲区已满,然后再发送。

在设置TCP_NODELAY时,您是否使用了wireshark或其他东西来查看幕后发生的事情?

只需使用fdopen。 在Linux中,任何东西都是文件。 例如。

 FILE *f = fdopen(socketdescriptor, "w+"); . . . n = write(socketdescriptor, "this is a message", 17); fflush(f); ... 

您不能显式刷新为套接字,因为数据总是尽快发送,考虑到接收器的可用缓冲区空间以及避免网络拥塞的需要。 设置TCP_NODELAY允许发送小于最大大小的数据包,同时仍有未完成的确认。

socket-unix-faq说你不能刷sockets