Saya memiliki masalah yang sama hari ini; sayangnya, di sistem saya, -T pilihan lsof tidak menerima f bendera, dan saya juga tidak ingin membuat knetstat modul kernel.
Untungnya, saya berada di posisi yang bisa strace aplikasi saat menyiapkan soket, seperti ini:
strace -e trace=setsockopt -f -o /tmp/log ./program arg1 arg2
Ini melacak ./program arg1 arg2 , menulis jejak ke /tmp/log . Kami hanya melacak setsockopt() panggilan sistem, yang digunakan untuk mengatur opsi soket. Opsi -f membuat strace lacak juga setiap proses turunan yang dibuat oleh program yang dilacak.
Jika Anda beruntung, /tmp/log akan berisi baris seperti ini:
18806 setsockopt(60, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0
Ini menunjukkan bahwa proses 18806 disebut setsockopt() pada FD 60 untuk mengatur SO_KEEPALIVE ke 1 (mengaktifkannya), dan panggilan sistem berhasil dengan mengembalikan kode 0 .
Anda juga dapat melampirkan ke proses yang ada:
strace -e trace=setsockopt -f -o /tmp/log -p PID
Anda dapat melepaskan diri dari proses menggunakan CTRL-C , dan hilangkan -o opsi dan argumennya untuk mengirim pelacakan ke stderr .
Di Linux, Anda dapat menggunakan modul kernel knetstat untuk memeriksa opsi soket, termasuk SO_BROADCAST .
Anda dapat menggunakan lsof(8) . Jika PID adalah ID proses dan FD adalah nomor deskriptor file dari soket yang Anda minati, Anda dapat melakukan ini:
lsof -a -p PID -d FD -T f
Untuk mendaftar semua soket IPv4 dari suatu proses:
lsof -a -p PID -i 4 -T f
Ini akan mencetak opsi soket dengan SO= , antara lain informasi. Perhatikan bahwa jika tidak ada opsi yang disetel, Anda akan mendapatkan string kosong, jadi Anda akan melihat sesuatu seperti SO=PQLEN=0 dll. Untuk menguji SO_BROADCAST , cukup ambil string SO_BROADCAST setelah SO= , mis.
if lsof -a -p PID -d FD -T f | grep -q 'SO=[^=]*SO_BROADCAST'; then
# socket has SO_BROADCAST
else
# it doesn't
fi