का उपयोग करते समय सॉकेट समस्या क्या कोई मुझे बता सकता है कि निम्न कोड क्यों काम नहीं करता है?थ्रेडिंग
using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
namespace SocketThreadingTest
{
class Program
{
static void Main(string[] args)
{
Thread t = new Thread(delegate()
{
BeginConnect(new IPEndPoint("some address"));
});
t.Start();
Console.ReadKey();
}
public static void BeginConnect(IPEndPoint address)
{
try
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.BeginConnect(address, ConnectCallback, socket);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
private static void ConnectCallback(IAsyncResult ar)
{
Socket sock = (Socket)ar.AsyncState;
try
{
sock.EndConnect(ar);
Console.WriteLine("Connected {0}", sock.LocalEndPoint);
sock.Send(Encoding.UTF8.GetBytes("Hello"));
Console.WriteLine("success");
sock.Close();
}
catch (Exception ex)
{
Console.WriteLine("send ex " + ex);
if (sock != null)
sock.Close();
}
}
}
}
निर्गम (सॉकेट के स्थानीय अंत बिंदु पर ध्यान दें) है:
Connected 0.0.0.0:28142
send ex System.Net.Sockets.SocketException: A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram
socket using a sendto call) no address was supplied
at System.Net.Sockets.Socket.Send(Byte[] buffer, Int32 offset, Int32 size, So
cketFlags socketFlags)
at System.Net.Sockets.Socket.Send(Byte[] buffer)
at SocketThreadingTest.Program.ConnectCallback(IAsyncResult ar) in Program.cs:line 44
पाठ्यक्रम जब मैं एक धागा का उपयोग नहीं करते और BeginConnect फोन के सीधे यह ठीक काम करता है। और भी परेशान बात यह है कि एक थ्रेड जोड़ना। सोना जो काफी लंबा है (1 सेकंड) यह भी ठीक काम करता है। कोई विचार? धन्यवाद।
धागा आपके द्वारा बनाए जाने BeginConnect कॉल बाहर निकालता है। यदि आप उस थ्रेड एंड को नहीं देते हैं तो क्या आप कोई अलग व्यवहार देखते हैं (एपीआई दस्तावेज़ नोट्स थ्रेड कॉलिंग सॉक होने पर समस्याएं हैं। बैजिन कनेक्ट कनेक्ट होता है हालांकि पहले से जुड़े सॉकेट पर केवल एक मुद्दा होना चाहिए) – nos
हां एक अंतर है। जैसा कि मैंने कहा, प्रोग्राम को कॉल करने के बाद भी एक छोटी सी नींद जोड़ना। बेजिन कनेक्ट इस काम को बनाता है। एपीआई दस्तावेज़ कहता है: "यदि यह सॉकेट पहले डिस्कनेक्ट हो गया है, तो BeginConnect को थ्रेड पर कॉल किया जाना चाहिए जो ऑपरेशन पूरा होने तक बाहर नहीं निकलता है। यह अंतर्निहित प्रदाता की सीमा है।" लेकिन जैसा कि आपने कहा है कि यह एक नया सॉकेट है और पहले डिस्कनेक्ट नहीं किया गया है ... – Zvika