Saya mencoba untuk bermain dengan komunikasi antar-proses dan karena saya tidak tahu cara menggunakan pipa bernama di bawah Windows saya pikir saya akan menggunakan soket jaringan. Semuanya terjadi secara lokal. Server dapat meluncurkan budak dalam proses terpisah dan mendengarkan pada beberapa port. Budak melakukan pekerjaan mereka dan menyerahkan hasilnya kepada tuan. Bagaimana cara mengetahui port mana yang tersedia? Saya menganggap saya tidak dapat mendengarkan pada port 80 atau 21?
Saya menggunakan Python, jika itu memotong pilihan.
Terima kasih!
Jawaban:
Jangan mengikat ke port tertentu, atau mengikat ke port 0, misalnya
sock.bind(('', 0))
. OS kemudian akan memilih port yang tersedia untuk Anda. Anda bisa mendapatkan port yang dipilih menggunakansock.getsockname()[1]
, dan meneruskannya ke budak sehingga mereka dapat terhubung kembali.sumber
sock.bind(('',0))
Demi cuplikan dari apa yang telah dijelaskan orang-orang di atas:
sumber
s.bind(('localhost', 0))
lebih baiks.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
socket.SO_REUSEADDR
benar-benar membantu dalam kasus ini? Dari apa yang saya baca, hanya relevan bahwa soket yang mencoba untuk mengikat memilikiSO_REUSEADDR
dan tidak relevan apakah bendera itu diatur pada soket yang melekat.Ikat soket ke port 0. Port bebas acak dari 1024 hingga 65535 akan dipilih. Anda dapat mengambil port yang dipilih dengan
getsockname()
segera setelah itubind()
.sumber
Anda dapat mendengarkan port apa pun yang Anda inginkan; umumnya, aplikasi pengguna harus mendengarkan port 1024 ke atas (melalui 65535). Hal utama jika Anda memiliki jumlah pendengar yang bervariasi adalah mengalokasikan rentang ke aplikasi Anda - katakanlah 20000-21000, dan CATCH EXCEPTIONS . Itulah bagaimana Anda akan tahu jika suatu port tidak dapat digunakan (digunakan oleh proses lain, dengan kata lain) di komputer Anda.
Namun, dalam kasus Anda, Anda seharusnya tidak memiliki masalah menggunakan port hard-coded tunggal untuk pendengar Anda, selama Anda mencetak pesan kesalahan jika bind gagal.
Perhatikan juga bahwa sebagian besar soket Anda (untuk para budak) tidak perlu secara eksplisit terikat ke nomor port tertentu - hanya soket yang menunggu koneksi masuk (seperti master Anda di sini) perlu dibuat pendengar dan terikat ke port. Jika port tidak ditentukan untuk soket sebelum digunakan, OS akan menetapkan port yang bisa digunakan untuk soket. Ketika master ingin menanggapi seorang budak yang mengirimkan data, alamat pengirim dapat diakses ketika pendengar menerima data.
Saya kira Anda akan menggunakan UDP untuk ini?
sumber
Jika Anda hanya perlu menemukan port gratis untuk digunakan nanti, berikut ini cuplikan yang mirip dengan jawaban sebelumnya , tetapi lebih pendek, menggunakan socketserver :
Perhatikan bahwa port tidak dijamin tetap bebas, jadi Anda mungkin perlu memasukkan cuplikan ini dan kode yang menggunakannya dalam satu lingkaran.
sumber