ソケットポート多重化の問題、受信バッファ、送信バッファ--SetSockOpt
2732 ワード
デフォルトでは、1つのネットワークアプリケーションの1つのsocketが1つのポートをバインドしているため、他のsocketはこのポートを使用できません.
ポートの多重化
ポート多重化により、1つのアプリケーションで複数のsocketを1つのポートにバインドできます.
ソケットのSO_を設定するREUSEADDRオプションで、ポート多重化が可能です.
setsockopt()は、次のオプションをサポートします.「タイプ」はoptvalが指すデータのタイプを示します.(部分)
オプション
を選択します.
意味
SO_REUSEADDR
BOOL
スリーブインタフェースと使用中のアドレスバンドルを許可する(bind()を参照)
SO_SNDBUF
int
送信バッファサイズの指定
SO_RCVBUF
int
受信バッファサイズの決定
ポートの多重化:
SO_REUSEADDRは、以下の4つのケースで使用できます.(『Unixネットワークプログラミング』巻1、すなわちUNPv 1より抜粋)
1、同じローカルアドレスとポートを持つsocket 1がTIME_にある場合WAIT状態の場合、起動したプログラムのsocket 2がアドレスとポートを占有し、プログラムがこのオプションを使用します.
2、SO_REUSEADDRでは、同じport上で同じサーバの複数のインスタンス(複数のプロセス)を起動できます.ただし、インスタンスごとにバインドされるIPアドレスは同じではありません.この状況は、複数のNICまたはIP Aliasテクノロジーを使用する機器でテストできます.
3、SO_REUSEADDRは、単一のプロセスが同じポートを複数のsocketにバインドすることを可能にするが、各socketがバインドするipアドレスは異なる.これは2と似ていますが、違いはUNPv 1を見てください.
4、SO_REUSEADDRは、まったく同じアドレスとポートの重複バインドを許可します.しかし、これはUDPのマルチキャストにのみ使用され、TCPには使用されません.
ポート多重化関数を設定するには、バインド前に呼び出す必要があります.また、同じポートにバインドされているすべてのソケットが多重化されている場合は、次の点に注意してください.
受信バッファと送信バッファ
各Socketには自分のSend BufferとReceive Bufferがあります.sendとrecvの操作を行うと、すぐに戻るが、実はデータを送信するのではなく、対応するSend BufferとReceive Bufferに格納してすぐに戻ることに成功する.
TCPのフルデュプレクスの動作モードおよびTCPのスライドウィンドウは、この2つの独立したbufferおよびこのbufferの充填状態に依存する.
受信バッファRCVBUF
受信バッファbufferがいっぱいになったら
送信バッファSNDBUF
ポート多重化リファレンス:https://www.cnblogs.com/wangshaowei/p/10557539.html受信バッファ参照の送信:http://blog.chinaunix.net/uid-29075379-id-3905006.html https://www.jianshu.com/p/755da54807cd
ポートの多重化
ポート多重化により、1つのアプリケーションで複数のsocketを1つのポートにバインドできます.
ソケットのSO_を設定するREUSEADDRオプションで、ポート多重化が可能です.
int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
sockfd: 。
level: ; SOL_SOCKET、IPPROTO_TCP、IPPROTO_IP IPPROTO_IPV6。
optname: 。
optval: , 。
optlen:optval 。
setsockopt()は、次のオプションをサポートします.「タイプ」はoptvalが指すデータのタイプを示します.(部分)
オプション
を選択します.
意味
SO_REUSEADDR
BOOL
スリーブインタフェースと使用中のアドレスバンドルを許可する(bind()を参照)
SO_SNDBUF
int
送信バッファサイズの指定
SO_RCVBUF
int
受信バッファサイズの決定
ポートの多重化:
bool opt = true;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const void *)&opt, sizeof(opt));
SO_REUSEADDRは、以下の4つのケースで使用できます.(『Unixネットワークプログラミング』巻1、すなわちUNPv 1より抜粋)
1、同じローカルアドレスとポートを持つsocket 1がTIME_にある場合WAIT状態の場合、起動したプログラムのsocket 2がアドレスとポートを占有し、プログラムがこのオプションを使用します.
2、SO_REUSEADDRでは、同じport上で同じサーバの複数のインスタンス(複数のプロセス)を起動できます.ただし、インスタンスごとにバインドされるIPアドレスは同じではありません.この状況は、複数のNICまたはIP Aliasテクノロジーを使用する機器でテストできます.
3、SO_REUSEADDRは、単一のプロセスが同じポートを複数のsocketにバインドすることを可能にするが、各socketがバインドするipアドレスは異なる.これは2と似ていますが、違いはUNPv 1を見てください.
4、SO_REUSEADDRは、まったく同じアドレスとポートの重複バインドを許可します.しかし、これはUDPのマルチキャストにのみ使用され、TCPには使用されません.
ポート多重化関数を設定するには、バインド前に呼び出す必要があります.また、同じポートにバインドされているすべてのソケットが多重化されている場合は、次の点に注意してください.
受信バッファと送信バッファ
各Socketには自分のSend BufferとReceive Bufferがあります.sendとrecvの操作を行うと、すぐに戻るが、実はデータを送信するのではなく、対応するSend BufferとReceive Bufferに格納してすぐに戻ることに成功する.
TCPのフルデュプレクスの動作モードおよびTCPのスライドウィンドウは、この2つの独立したbufferおよびこのbufferの充填状態に依存する.
受信バッファRCVBUF
, read , socket 。
( socket, socket 。)
read , buffer , 。
受信バッファbufferがいっぱいになったら
TCP UDP , 。
**TCP UDP **
·TCP
TCP, ,buffer , : TCP 。 。
TCP , TCP 。 。 TCP , , TCP 。
·UDP
, , 。UDP ; , UDP 。
送信バッファSNDBUF
send , ( ), socket , send 。
,send , ( write ),send buffer socket buffer 。
UDP socket , , , , , 。
ポート多重化リファレンス:https://www.cnblogs.com/wangshaowei/p/10557539.html受信バッファ参照の送信:http://blog.chinaunix.net/uid-29075379-id-3905006.html https://www.jianshu.com/p/755da54807cd