2010-03-14 14 views
5

मैं मूल सॉकेट सर्वर के लिए विंडोज (ActivePerl) पर पर्ल पर fork() का उपयोग कर रहा हूं, लेकिन स्पष्ट रूप से समस्याएं हैं (यह कुछ बार बाद कनेक्शन स्वीकार नहीं करेगी), क्या कोई कामकाज है?विंडोज पर मेरा ActivePerl प्रोग्राम क्यों सॉकेट कनेक्शन स्वीकार करना बंद कर देता है?

यहाँ प्रासंगिक कोड का हिस्सा है:

while($client = $bind->accept()) { 
    $client->autoflush(); 
    if(fork()){ $client->close(); } 
    else { $bind->close(); new_client($client); exit(); } 
} 

उत्तर

6

मैं Net::Server स्थापित करने का सुझाव देना चाहता हूं और इसके बजाय इसका उपयोग कर रहा हूं, क्योंकि संभवतः आपके सुनने और फोर्किंग तर्क को लिखने के लिए कोई अनिवार्य कारण नहीं है, और नेट :: सर्वर पहले से ही कई प्लेटफार्मों पर काम करने के लिए अच्छी तरह से परीक्षण किया गया है ActivePerl। Net::Server::Fork व्यक्तित्व आपके द्वारा लिखे गए कोड के समान ही है, हालांकि मैं इसके बजाय Net::Server::Prefork का उपयोग करने का सुझाव दूंगा, क्योंकि यह न्यूनतम लागत पर बेहतर प्रदर्शन प्रदान करता है।

1

विंडोज कांटा नहीं है। इसे अनुकरण करने के प्रयास आमतौर पर आदर्श परिणामों से कम देते हैं।

सबसे अच्छा समाधान शायद आपके कोड को फिर से लिखना है ताकि यह कांटा का उपयोग न करे। शायद धागे?

+2

विंडोज पर पर्ल दृश्यों के पीछे धागे के साथ कांटा() को emulates। –

3

यदि कुछ से, तो आप वास्तव में 64 का मतलब है, तो आपको this discussion देखना चाहिए। माता-पिता प्रक्रिया में आपको पूर्ण बच्चों को साफ करने के लिए हर बार waitpid -1,&WNOHANG पर कॉल करना चाहिए।

संबंधित मुद्दे

 संबंधित मुद्दे