2012-09-17 7 views
18

मुझे विंडोज 8 और वीएस2012 के लिए विशिष्ट समस्या का सामना करना पड़ रहा है।विंडोज 8 - .NET टीसीपी AcceptAsync कॉलबैक फायरिंग नहीं (कंसोल द्वारा अवरोधित। रीडलाइन())

मेरे पास एक टीसीपी सॉकेट सर्वर और क्लाइंट है और स्थानीय नेटवर्क पर कुछ परीक्षण कर रहा हूं। Sycinternals TCPView के साथ, मैं देख सकता हूं कि पैकेट टीसीपी क्लाइंट से भेजे जाते हैं और टीसीपी सर्वर पर पहुंचते हैं (मुझे पैकेट काउंटर वृद्धि दिखाई देती है)।

हालांकि, ऐसा प्रतीत होता है जैसे डेटा एप्लिकेशन स्टैक पर नहीं बना रहा है? एक ही निर्माण विंडोज 7 पर बिना किसी समस्या के चलाता है।

मेरे पास विंडोज 8 फ़ायरवॉल बंद है और दोनों प्रक्रियाओं को यूएसी बंद डोमेन व्यवस्थापक उपयोगकर्ताओं पर उन्नत अनुमतियों के साथ चलाया गया है।

जब मैं क्लाइंट को किसी बाहरी सर्वर से कनेक्ट करता हूं (एक अलग मशीन पर चल रहा है), सब कुछ ठीक काम करता है। क्या विंडोज 8 में कुछ और है जो स्थानीय प्रक्रियाओं के बीच टीसीपी डेटा संचार को रोक सकता है?

धन्यवाद,

संपादित

अपने सर्वर आवेदन में यकीन है कि कुछ भी नहीं करने के लिए इस मुद्दे को पैदा कर रही है, मैं सॉकेट निर्माता के लिए निम्न कोड के साथ एक सांत्वना आवेदन में एक त्वरित TCP सर्वर बनाया,:

listenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

और एक ही स्थानीय IP पर सुनने/अपने सर्वर आवेदन के रूप में पोर्ट। मुझे एक ही समस्या का सामना करना पड़ रहा है, मैं बंदरगाह पर टेलनेट कर सकता हूं लेकिन listenerSocket.AcceptAsync कभी हिट नहीं होता है।

संपादित 2

आगे की जांच पर, यह appers मेरी समस्या Async सॉकेट कॉल के उपयोग के साथ कुछ करने के लिए है, यानी अगर मैं socket.Accept(), परीक्षण आवेदन की तरह तुल्यकालिक कॉल का उपयोग सामान्य रूप से प्रदर्शन कर रहा है। हालांकि, जब मैं Async सॉकेट कॉल का उपयोग करता हूं, यानी socket.AcceptAsync(), मैं उल्लिखित मुद्दों का सामना कर रहा हूं। अब तक मुझे async सॉकेट कॉल के संबंध में win7 & 8 के बीच मतभेदों का कोई उल्लेख नहीं मिला।

मेरा त्वरित नमूना ऐप यहां दिखाता है कि एसिंक कॉलबैक कभी ट्रिगर नहीं होता है। यह स्निपेट विंडोज 7 में ठीक काम करता है लेकिन विंडोज 8 में काम नहीं करता है (127.0.0.1: 7000 तक टेलनेट करने का प्रयास करें)।

class Program 
{ 
    private static SocketAsyncEventArgs socketAsyncEventArgs = new SocketAsyncEventArgs(); 

    static void Main(string[] args) 
    { 
     var listenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     listenerSocket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 7000)); 
     listenerSocket.Listen(100); 

     socketAsyncEventArgs.Completed += AcceptEventArg_Completed; 
     listenerSocket.AcceptAsync(socketAsyncEventArgs); 

     Console.ReadLine(); 
    } 

    private static void AcceptEventArg_Completed(object sender, SocketAsyncEventArgs e) 
    { 
     Console.WriteLine("AcceptEventArg_Completed"); 
    } 
} 

संपादित 3

मैंने पाया 2 अन्य माइक्रोसॉफ्ट कनेक्ट पर एक ही मुद्दे की रिपोर्टिंग: https://connect.microsoft.com/VisualStudio/feedback/details/759913/socketasynceventargs-completed-doesnt-fire-in-net-framework-4-5 और http://connect.microsoft.com/VisualStudio/feedback/details/747218/saea-not-working-in-net-4-5-rp

जबकि 2 एक दिलचस्प बात यह है के रूप में यह समाप्त करने के लिए है लगता है कंसोल में एक विंडोज बग। रीडलाइन() कॉल और यह समस्या उत्पन्न कर रहा है और एसिंक कॉलबैक को अवरुद्ध कर रहा है। अगर मैं Console.ReadLine() के साथ बदलें मेरी स्निपेट में:

  while (true) 
     { 
      System.Threading.Thread.Sleep(10); 
     } 

सब कुछ ठीक काम करता है।

+0

क्या आप मशीन के सार्वजनिक आईपी या लोकलहोस्ट के माध्यम से संचार कर रहे हैं? –

+0

स्थानीय नेटवर्क आईपी (स्थानीयहोस्ट नहीं) – TJF

+0

खैर, मुझे फ़ायरवॉल मुद्दे पर दृढ़ता से संदेह होगा, लेकिन चूंकि मैं अभी परीक्षण नहीं कर सकता कि मुझे यह सब मिला है, क्षमा करें। क्या आपने विंडोज फ़ायरवॉल में सर्वर ऐप को मैन्युअल रूप से अनुमति देने का प्रयास किया था? –

उत्तर

4

इस देखें: GetQueuedCompletionStatus can't dequeue IO from IOCP if the thread which originally issued the IO is blocking in ReadFile under windows 8

यह विंडोज़ 8 और 2012 में एक बग है और सभी कार्यक्रमों के लिए जो AcceptEx और ReadFile इस्तेमाल किया प्रभावित करते हैं। अभी के लिए, केवल इन दो कार्यों को प्रभावित माना जाता है।

0

मैं एक ही बात को पूरा जब मैं SocketAsyncEventArgs

साथ TCP सर्वर और क्लाइंट अनुप्रयोग विकसित कर रहा था मैं सुझाव है कि आप पहले इसे आज़माएं।

  1. उन्नत सुरक्षा जांच इनबाउंड/आउटबाउंड नियमों के साथ खुला Windows फ़ायरवॉल देखने के लिए अगर आपके आवेदन अवरुद्ध है।

  2. खुला AssemblyInfo.cs और बदल

[विधानसभा: Guid ("06985fe3-80eb-48b4-940a-fd926e2f2053")]

किसी अन्य GUID मान पर

इसे बदलकर, विंडोज़ सोचेंगे कि यह एक नया एप्लीकेशन है और यदि पुराने एप्लिकेशन की ओर कोई प्रतिबंध था, तो यह नए पर नहीं होगा।

0

Windows 8 पर (सिर्फ AcceptEx की संभवतः) IOCP प्रसंस्करण से संबंधित इस खिड़कियों बग की तरह लगता है, जबकि अन्य अवरुद्ध I/O ही धागे पर कार्य प्रगति पर है:

http://social.technet.microsoft.com/Forums/en-GB/winserver8gen/thread/5764cd0f-fda1-4cfa-ae35-808210bae77e

तो गर्तिका कनेक्शन स्वीकार किया जाता है, लेकिन आपका ऐप कभी इसकी अधिसूचना प्राप्त नहीं करता है।

शायद विंडोज 8 कंसोलस जैसे सिंक्रोनस आईओ को कन्वर्ट करने के लिए कुछ अजीब, कठोर टूटा हुआ, वूडू करता है। आंतरिक रूप से एसिंक में पढ़ें।

आप अपने सर्वर कोड को एक अलग थ्रेड में ले जा सकते हैं, अन्य कामकाज को निष्पादित करने के लिए प्रयास किया जा सकता है या कंसोल प्रोसेसिंग को एसिंक्रोनस के रूप में बदलने के लिए (मैं वास्तव में कोशिश नहीं कर सकता क्योंकि मेरे पास विंडोज नहीं है 8)।