在C套接字编程中刷新套接字流
我想知道在C语言中进行套接字编程时如何刷新套接字流。我尝试了所有选项 – 使用以下代码设置TCP_NODELAY
setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(int));
注意:所有flag
和sockfd
都被正确声明。
我在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