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

Moh*_*lla 8 c sockets

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

setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(int));      
Run Code Online (Sandbox Code Playgroud)

注意:所有flagsockfd正确声明.

我之前send(和之后都使用过这个功能,send()但它没有任何区别.

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

shutdown(sockfd, SHUT_WR);
Run Code Online (Sandbox Code Playgroud)

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

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

Ton*_*ion 5

在谷歌上做一些研究,似乎没有办法显式刷新套接字流。您可以设置 TCP_NODELAY,然后它将关闭 TCP Nagle 算法。这应该确保数据立即发送,而不是等到缓冲区满后再发送。

当你设置 TCP_NODELAY 时,你是否使用过wireshark 或其他东西来查看幕后发生了什么?


Nik*_*sov 4

您可能想阅读The Ultimate SO_LINGER page,或者:why is my tcp not reliable,我认为这适用于您的情况。

编辑:

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