TCPパッケージの送信が成功したかどうかをどう判断しますか?
2172 ワード
原文の住所:http://blog.csdn.net/ordeder/article/details/17240221
1.TCP送信インターフェース:send()
TCP送信データのインターフェースにはsend,write,sendmsgがあります.これらの関数はシステムカーネル内に統一された入口があります.すなわち、sock_です.sendmsg()TCPは信頼できる伝送であるため、sn=send(…)のようにTCPの送信インターフェースに対して誤解が生じやすい.snの値はsnバイトのデータが受信端に送信されたことを示しているとエラーが認識されます.真実はそうではない.
TCPの送受信はカーネル(linux)に対応するバッファがあることを知っています.
送信側に対しては、ユーザ空間呼び出しsend(data)などの送信インターフェースがデータを送信し、内部コアが内部コア空間のsocketに対応するバッファにdataをコピーする.すなわち、sock.write_.queuesend()関数の戻り値は、今回のsend()呼び出しで成功コピーされたバイト数(ユーザ空間->カーネル空間に対応するsockバッファキュー)のみを表します.具体的な送受信はTCPプロトコルで行われ、TCPは信頼できる伝送であるが、これは送信側と受信側のネットワークが接続されていることを前提としている.このように、send()を呼び出して送信するユーザには、受信者がデータを受信したかどうかを判定するためには、他の方法で照会する必要がある.
2.send()渋滞と渋滞ではない
前にも述べましたが、sn=send(data)はデータをカーネル空間にコピーする責任があります.具体的な送信はtcpの後で完了します.ブロックされたデータとブロックされていないデータは、空間的にカーネル空間にコピーされた送信バッファからの期間だけです.
1.バッファの残り容量が送信したいdataのバイト数より大きい場合、ブロッキングとブロッキングではなく、データをカーネルバッファにコピーすることに成功し、返したsnは送信したいデータのバイト数に等しい.
2.送信バッファの空き容量が送信したいデータのバイト数より小さい場合、
a.ブロックモードはブロックされます.カーネルバッファの空き容量を待って、データをカーネルバッファにコピーし続けます.全部コピーするまで.リターンrnはdataのデータ量です.
b.閉塞モードではなく、カーネル送信バッファが満たされたら、すぐに戻ります.rn=dataで送信バッファにコピーされたデータ量です.
3.受信成功データをどう判定しますか?
1.受信側応答情報.
この方法は比較的に土ですが、実用的です.
2.送信側sock送信済みデータ量を計算する
参考:TCPパケットの送信が成功したかどうかをどう判断するか? 作者の言及は使用可能です. ioctlインターフェース:ioctl(tcpusocket、SIOCOUTQ、&value);
1.TCP送信インターフェース:send()
TCP送信データのインターフェースにはsend,write,sendmsgがあります.これらの関数はシステムカーネル内に統一された入口があります.すなわち、sock_です.sendmsg()TCPは信頼できる伝送であるため、sn=send(…)のようにTCPの送信インターフェースに対して誤解が生じやすい.snの値はsnバイトのデータが受信端に送信されたことを示しているとエラーが認識されます.真実はそうではない.
TCPの送受信はカーネル(linux)に対応するバッファがあることを知っています.
struct sock{
...
struct sk_buff_head receive_queue; //
struct sk_buff_head write_queue; //
...
}
送信側に対しては、ユーザ空間呼び出しsend(data)などの送信インターフェースがデータを送信し、内部コアが内部コア空間のsocketに対応するバッファにdataをコピーする.すなわち、sock.write_.queuesend()関数の戻り値は、今回のsend()呼び出しで成功コピーされたバイト数(ユーザ空間->カーネル空間に対応するsockバッファキュー)のみを表します.具体的な送受信はTCPプロトコルで行われ、TCPは信頼できる伝送であるが、これは送信側と受信側のネットワークが接続されていることを前提としている.このように、send()を呼び出して送信するユーザには、受信者がデータを受信したかどうかを判定するためには、他の方法で照会する必要がある.
2.send()渋滞と渋滞ではない
前にも述べましたが、sn=send(data)はデータをカーネル空間にコピーする責任があります.具体的な送信はtcpの後で完了します.ブロックされたデータとブロックされていないデータは、空間的にカーネル空間にコピーされた送信バッファからの期間だけです.
1.バッファの残り容量が送信したいdataのバイト数より大きい場合、ブロッキングとブロッキングではなく、データをカーネルバッファにコピーすることに成功し、返したsnは送信したいデータのバイト数に等しい.
2.送信バッファの空き容量が送信したいデータのバイト数より小さい場合、
a.ブロックモードはブロックされます.カーネルバッファの空き容量を待って、データをカーネルバッファにコピーし続けます.全部コピーするまで.リターンrnはdataのデータ量です.
b.閉塞モードではなく、カーネル送信バッファが満たされたら、すぐに戻ります.rn=dataで送信バッファにコピーされたデータ量です.
3.受信成功データをどう判定しますか?
1.受信側応答情報.
この方法は比較的に土ですが、実用的です.
2.送信側sock送信済みデータ量を計算する
参考:TCPパケットの送信が成功したかどうかをどう判断するか? 作者の言及は使用可能です. ioctlインターフェース:ioctl(tcpusocket、SIOCOUTQ、&value);