当前位置: 技术问答>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。
有没有办法能一拔掉网线,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()不返回错误值,你就尽管发,对端收不到消息,那就是内核协议
栈的错,这个不应该你来买单!
检测得到,如果你此时用writev()发送消息,并且内核协议栈也知道了底层有问题,就不会向下发了,会报错给
你。而通常上层应用又都有缓存区,假如你用writev()发了数据,函数也返回了,而此时内核协议栈得到了底层
的indication,它就有可能将数据保存在缓冲区中,等到物理链路恢复以后,重发这个消息,但是这个过程中,
应该不会给你的上层应用程序返回一个错误,这个不考虑你的消息有ack认证的情况哦。
所以我觉得,你不用管链路的状态,只要writev()不返回错误值,你就尽管发,对端收不到消息,那就是内核协议
栈的错,这个不应该你来买单!