我知道一個 IP 可以被多個行程使用,但我的用例要求一個 IP 只由一個行程使用。
我的機器 (ubuntu) 上有多個 IP,并且多個正在運行的行程正在使用這個 IP 作為 tcp 客戶端。這些 IP 具有相同的路由設定(度量標準除外)。每個行程都使用其中一個 IP。問題是我手動分配了哪個行程使用哪個 IP。
我想知道我是否可以使這個程序自動化。當一個行程啟動時,它檢查給定的 ip 串列,并使用第一個未被占用的。這可能嗎?
uj5u.com熱心網友回復:
對于您想要使用的每個可能的 IP,嘗試將您的套接字與所有客戶端都將使用的已知埠一起系結到該 IP。如果系結呼叫成功,則該套接字將僅是一個使用該 IP 和埠的套接字。
如果系結呼叫失敗并顯示錯誤代碼EADDRINUSE,則您知道某個其他套接字已系結到該 IP 和埠。然后您可以嘗試串列中的下一個IP。
uj5u.com熱心網友回復:
設定:創建bridge0具有 5 個 IP 地址的介面
ip link add name bridge0 type bridge
ip link set bridge0 up
ip addr add 192.168.1.5/24 dev bridge0
ip addr add 192.168.1.6/24 dev bridge0
ip addr add 192.168.1.7/24 dev bridge0
ip addr add 192.168.1.8/24 dev bridge0
ip addr add 192.168.1.9/24 dev bridge0
要查看可用的 IP 地址:
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether xxxx brd ff:ff:ff:ff:ff:ff
inet xxxx/24 brd xxxx scope global dynamic noprefixroute wlan0
valid_lft 299sec preferred_lft 299sec
inet6 xxxx/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: bridge0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether xxxx brd ff:ff:ff:ff:ff:ff
inet 192.168.1.5/24 scope global bridge0
valid_lft forever preferred_lft forever
inet 192.168.1.6/24 scope global secondary bridge0
valid_lft forever preferred_lft forever
inet 192.168.1.7/24 scope global secondary bridge0
valid_lft forever preferred_lft forever
inet 192.168.1.8/24 scope global secondary bridge0
valid_lft forever preferred_lft forever
inet 192.168.1.9/24 scope global secondary bridge0
valid_lft forever preferred_lft forever
inet6 fe80::6c8e:f0ff:fe1f:6779/64 scope link
valid_lft forever preferred_lft forever
只獲取可用的 IP 地址:
$ ip addr | grep inet | grep bridge0
inet 192.168.1.5/24 scope global bridge0
inet 192.168.1.6/24 scope global secondary bridge0
inet 192.168.1.7/24 scope global secondary bridge0
inet 192.168.1.8/24 scope global secondary bridge0
inet 192.168.1.9/24 scope global secondary bridge0
或者:
$ ip addr | grep inet | grep bridge0 | awk '{print $2}'
192.168.1.5/24
192.168.1.6/24
192.168.1.7/24
192.168.1.8/24
192.168.1.9/24
然后你可以使用ss查看使用了哪個埠:
$ ss -ltn
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 80 0.0.0.0:3306 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 5 127.0.0.1:52698 0.0.0.0:*
LISTEN 0 80 [::]:3306 [::]:*
LISTEN 0 511 *:80 *:*
LISTEN 0 50 *:1716 *:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 256 *:3128 *:*
或者:
$ ss -ltn | awk '{print $4}'
Local
0.0.0.0:3306
0.0.0.0:22
127.0.0.1:52698
[::]:3306
*:80
*:1716
[::]:22
*:3128
然后你可以決議輸出來決定哪個埠仍然沒有使用
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/378644.html
