【问题标题】:what will happen to FILE stream buffer when socket connection disconnect abnormally?socket连接异常断开时,FILE流缓冲区会发生什么?
【发布时间】:2011-03-14 02:09:24
【问题描述】:

我的 TCP 服务器代码是这样的:

conn_fd = accept();  
stream = fdopen(conn_fd...);  
//...   
fp = fopen(path, "r");   
while ((c = getc(fp)) != EOF)
    fputc(c, stream);

如果套接字由于某种原因断开(以太网线拔出),fputc 函数会阻塞调用进程吗?流缓冲区会发生什么?
如果 fputc 函数阻塞,我可以设置 SO_SNDTIMEO 来解决问题吗?

非常感谢!

【问题讨论】:

    标签: c linux network-programming


    【解决方案1】:

    在连接终止时,所有读/写函数都将返回错误(只有在读取传入缓冲区后才会开始读取失败)。如果您想确定为什么无法读取/写入更多数据,请检查 errno。

    【讨论】:

    • 请注意,虽然可能无法及时检测到连接终止 - 如果是这样,一旦发送缓冲区填满,fputc() 函数 可以 阻塞。
    • 确实如此,而且默认的 TCP 超时时间相当长。但是这种情况只会发生在网络故障的情况下——TCP终止包无法发送,数据包根本没有回复。
    • 实际上默认情况下程序会得到一个SIGPIPE信号并被终止而不是看到错误。
    • 这是真的吗?我认为只有标准输出会这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多