मुझे विंडोज 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);
}
सब कुछ ठीक काम करता है।
क्या आप मशीन के सार्वजनिक आईपी या लोकलहोस्ट के माध्यम से संचार कर रहे हैं? –
स्थानीय नेटवर्क आईपी (स्थानीयहोस्ट नहीं) – TJF
खैर, मुझे फ़ायरवॉल मुद्दे पर दृढ़ता से संदेह होगा, लेकिन चूंकि मैं अभी परीक्षण नहीं कर सकता कि मुझे यह सब मिला है, क्षमा करें। क्या आपने विंडोज फ़ायरवॉल में सर्वर ऐप को मैन्युअल रूप से अनुमति देने का प्रयास किया था? –