同じ IP (10080、20081、30082) からの異なるポートをリッスンする 3 つのソケットがあります。さまざまなスレッド (実際には pthreads) でソケットを作成し、それをバインドしました。Accept() を実行すると、3 つのソケットがクライアント呼び出しを待機しますが、任意のポートの呼び出しを実行すると、常に最後の Accept() を作成するソケットに応答します。
それが私のプロセスです(C ++):
スレッド 1
ポート 10080 のソケットを作成します
ポート 10080 のバインド ソケット
ポート 10080 をリッスンする
ポート 10080 を受け入れる
................................................................... ...................................
スレッド 2
ポート 20081 用のソケットを作成します
ポート 20081 のバインド ソケット
ポート 20081 をリッスンする
ポート 20081 を受け入れる
................................................................... ...................................
スレッド 3
ポート 30082 のソケットを作成します
ポート 30082 のバインド ソケット
ポート 30082 をリッスンする
ポート 30082 を受け入れる
................................................................... ...................................
どのポート (10080、20081、または 30082) を呼び出しているかに関係なく、常に「スレッド 3」の処理が続行されます。
正しいスレッドで情報を処理するのを手伝ってくれる人はいますか?
ありがとう。
PS: メイン ソケットにあるポートと、Accept() 命令によって作成されたソケットにあるポートを監視していますが、メイン ソケットはまだ正しく (30082)、Accept ソケットには呼び出されたポート (10080、20081、または 30082) があります。 )。
struct addrinfo lRequestAddrInfo;
struct addrinfo * lResultAddrInfo;
int lSocketOption = 1;
memset(&lRequestAddrInfo,0,sizeof(lRequestAddrInfo));
lRequestAddrInfo.ai_socktype=SOCK_STREAM;
lRequestAddrInfo.ai_flags=AI_PASSIVE;
int lReturn = 0;
lReturn = getaddrinfo(lAddress->ip.c_str(), lAddress->port.c_str(), &lRequestAddrInfo, &lResultAddrInfo);
int lSocket = socket(lResultAddrInfo->ai_family, SOCK_STREAM, lResultAddrInfo->ai_protocol);
setsockopt(lSocket, SOL_SOCKET, SO_REUSEADDR, &lSocketOption, sizeof(lSocketOption));
lReturn = bind(lSocket, lResultAddrInfo->ai_addr, lResultAddrInfo->ai_addrlen);
lReturn = listen(lSocket, SOMAXCONN);
while(IsConnected())
{
struct sockaddr lSocketAddress;
socklen_t lSocketAddresslen = sizeof(lSocketAddress);
lNewSocket = accept(pListener->_connection, &lSocketAddress, &lSocketAddresslen);
if (lNewSocket > -1)
{
//process information in new thread
}
}
これはスレッド内のコードです。より詳しい情報:
スレッド 1
lソケット = 3 (ポート 10080)
スレッド 2
lSocket = 5 (ポート 20081)
スレッド 3
lSocket = 7 (ポート 30082)
ポート10080で呼び出すと
lSocket = 7 (ポート 30082) lNewSocket = 4 (ポート 10080)
ポート20081で呼び出すと
lSocket = 7 (ポート 30082) lNewSocket = 6 (ポート 20081)
ポート30082で呼び出すと
lSocket = 7 (ポート 30082) lNewSocket = 8 (ポート 30082)