当前位置:  技术问答>linux和unix

关于writev函数

    来源: 互联网  发布时间:2016-05-25

    本文导语:  用writev函数通过socket送信,不能在拔掉网线后即时的检验到网络错误。 有没有办法能一拔掉网线,writev函数就调用失败呢? 我试了一种方法,在writev调用后,立即刷socket缓冲,然后去判断errno, 可是即使这样也不会...

用writev函数通过socket送信,不能在拔掉网线后即时的检验到网络错误。
有没有办法能一拔掉网线,writev函数就调用失败呢?

我试了一种方法,在writev调用后,立即刷socket缓冲,然后去判断errno,
可是即使这样也不会产生errno,请大大们帮忙帮忙。

部分代码如下:
FILE* ssp = fdopen(Sd,"r+");
if(ssp == NULL){
  Putlog(LL_DEBUG,"fdopen error:%sn",strerror(errno));
  exit(1);
}
errno=0;
writev(Sd, iov, 2);
fflush(ssp);
if(errno != 0) Putlog(LL_DEBUG,"--------write error:%sn",strerror(errno));

上面代码fdopen后不为空,但会产生一个errno,illegal seek!
writev-〉fflush后不会产生errno。

|
我觉得如果你是在应用层编程的,底层链路有问题了,会自动的给上层递indication上来的,这样内核协议栈会

检测得到,如果你此时用writev()发送消息,并且内核协议栈也知道了底层有问题,就不会向下发了,会报错给

你。而通常上层应用又都有缓存区,假如你用writev()发了数据,函数也返回了,而此时内核协议栈得到了底层

的indication,它就有可能将数据保存在缓冲区中,等到物理链路恢复以后,重发这个消息,但是这个过程中,

应该不会给你的上层应用程序返回一个错误,这个不考虑你的消息有ack认证的情况哦。

所以我觉得,你不用管链路的状态,只要writev()不返回错误值,你就尽管发,对端收不到消息,那就是内核协议

栈的错,这个不应该你来买单!

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 问下网络编程中使用readv和writev~~
  • 用accept系统调用得到的socket能用在readv和writev上吗?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    博客 iis7站长之家