sendto & SO_SNDTIMEO

請問各位大大,是否有人利用sendto 和 SO_SNDTIMEO寫過程式,一些問題如下:
1.sendto是否可以具有timeout的功能?
2.若有是利用SO_SNDTIMEO來撰寫嗎?
3. timout 與 host is down是否可以寫在同一個程式上?

sendto()本身并没有timeout()的功能,可以用SO_SENDTIMEO来控制。

send timeout 和 host is down 是两个不同的概念,不明白你要“写在同一程式”上是什么意思。你最好解释一下具体你想完成什么?

1.sendto即沒有timeout的功能,那用SO_SNDTIMEO是控制什麼時間呢?而若時間到了,sendto的回傳值為-1時其Errors: EBADF、EDESTADDRREQ、EFAULT、EMSGSIZE、ENOBUFS、 ENOTSOCK 、EWOULDBLOCK 是何種呢?
2.運用的地方為,若目地是兩種情況 A.若為未開機-會傳回Host is down B.若為開機,但是因回應有問題,會回傳sendto 的timeout,或是利用recvfrom的timeout,如此你懂運 用之處了嗎?
3.若可,是否可提供一個簡單example或提供網站可以參考

发送,是把数据从你的程序先传到 tcpip 并存在它的buffer里 (socket buffer)。然后TCPIP再根据情况,从socket buffer里取出数据,进行处理,最后通过硬件传到网上。

也就是说,“发送成功”,仅只代表你的数据被成功转存到socket buffer里了,跟网络另一端的机器状况完全无关。

“发送”会被阻塞,是因为你要发送的数据太多,超过了socket buffer的空闲空间(比如在一个socket上快速发送)。这样,因为不是所有的数据被转存到socket buffer里,TCPIP会阻塞发送程序,等socket buffer有了空闲(一部份数据被送出去了),再把余下的数据从你的程序转存到socket buffer.

如果你设了 SO_SNDTIMEO,则在阻塞一定时间后,如果socket buffer还是没有空闲,TCPIP会取消阻塞,让你的程序可以继续运行。

对方关机,对方的程序接收得太慢,网络上的router出了故障等等,都会造成socket buffer里的数据发不出去。