10

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

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

注意:所有的flagandsockfd都被正确声明了。

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

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

shutdown(sockfd, SHUT_WR);

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

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

4

5 回答 5

5

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

设置 TCP_NODELAY 时,您是否使用过wireshark 或其他工具来查看幕后情况?

于 2010-01-31T11:16:40.837 回答
3

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

编辑:

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

于 2010-02-01T14:31:38.503 回答
2

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

于 2011-08-21T12:21:51.340 回答
2

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

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

...
于 2013-09-04T23:55:42.327 回答
0

socket-unix-faq 说你不能刷新套接字

于 2010-02-05T15:33:09.427 回答