2010-04-13 4 views
6

Sıfır olmayan bir bağlantı noktası yerine bağlantı noktası 0 olan bir TCP istemci soketi oluşturursanız, işletim sistemi sizin için ücretsiz geçici bağlantı noktası seçer. Çoğu işletim sistemi, 49152-65535'in IANA dynamic port range'dan geçici bağlantı noktalarını seçer. Ancak, Windows Server 2003 ve önceki sürümlerinde (XP dahil) Microsoft, bind() documentation numaralarına göre 1025-5000 bağlantı noktalarını geçici aralık olarak kullandı.WinXP etrafında geçici olarak 1025-5000 bağlantı noktalarını kullanarak nasıl çalışabilirim?

Aynı donanımda birden fazla Java servisi çalıştırıyorum. Nadir durumlarda, bu aralık diğer hizmetler için kullandığım iyi bilinen bağlantı noktalarıyla çakışır (örn. Jini bulma için bağlantı noktası 4160). Nadir olsa da, bu gerçek sorunlara neden olmuştur. Windows veya Java'ya istemci soketleri için farklı bir bağlantı noktası aralığı kullanmasını söylemenin kolay bir yolu var mı? Microsoft'un dokümanları, bu aralığın yüksek ucunu MaxUserPort TcpIP kayıt defteri ayarıyla değiştirebileceğimi gösteriyor, ancak alt ucu değiştirmenin bir yolunu görmüyorum.

Güncelleme: Bu konuda biraz ilerleme kaydettim. Microsoft, geçici bağlantı noktası aralığının istisnaları olan ayrılmış bağlantı noktaları konseptine sahip gibi görünüyor. Bu kalıcı olarak değiştirmenize izin veren bir registry setting var ve görünüşe göre aynı şeyi yapmak için bir API olmalı, çünkü ayrılmış port aralıkları için yüksek/düşük değerler tutan bir data structure var, ama gerçek fonksiyon çağrısını herhangi bir yerde bulamıyorum ... Kayıt defteri çözümü işe yarayabilir, ancak şimdi bu API üzerinde sabitlendim.

Update2: Windows kayıt defteri aracılığıyla bunun nasıl yapılacağı konusunda ServerFault numaralı çözümü nasıl kabul ettim. API yoluyla bunu yapmak için bir yol daha istiyorum, ama sanırım şu an için memnunum.

+0

bu sunucufault.com'a gitmemeli midir? –

+0

Hayır doğru yer burası, sadece bir programın rastgele bir yazılımı yapılandırmak için değil, bir programlama sorusu. – thecoshman

+0

@GrzegorzOledzki: iyi soru. Belki de oraya gönderim yapmalıyım. Sysadmin çözümlerini ve programlama çözümlerini kabul edeceğim. Dinleme yuvaları için, bağlantı noktalarının hiçbirinin iyi bilinen bağlantı noktalarıyla çakıştığından emin olmak için kodlandım (Jini/River, Java RMI için çok sayıda dinamik bağlantı ayırma kullandı, bu yüzden bu bir sorun oldu!), Ancak istemci soket sorunu beni yakaladı sürprizle. –

cevap

0

Geçici bağlantı noktaları için OS desteğini kullanmak kadar zarif değil, ancak docs, soketinizin bağlanması için bir bağlantı noktası belirtmeniz gerektiğini gösterir. İstediğiniz aralığın tabanında bir bağlantı noktası belirtin ve kullanılıyorsa bir istisna atılacak, bu durumda bağlantı noktasını artırıp tekrar deneyin. Pencerelerin istediğiniz port aralığını kullanmadığı düşünülürse, pek çok çarpışma olmamalıdır.

+0

Evet, teşekkürler, tam olarak bu yuvalar için uyguladığım şeydir. Ama ben tüm giden soketler için büyük kod tabanını araştırmaktan ve aynı şeyi yapmaktan korkuyorum çünkü geliştiriciler daha basit olması gereken giden bağlantılar hakkında daha fazla varsayımlar yapıyorlar. –