Кто-нибудь работал с сокетами в Silverlight? Сделал одну тестовую программу, не получается подконнектиться к веб-серверу | Код | internal sealed class SocketClient : IDisposable { private const int Receive = 1; private const int Send = 0;
private bool isConnected = false;
private Socket socket; private DnsEndPoint endPoint;
private static AutoResetEvent autoEvent = new AutoResetEvent(false); private static AutoResetEvent[] autoSendReceiveEvents = new AutoResetEvent[2] { new AutoResetEvent(false), new AutoResetEvent(false) };
internal SocketClient(string host, int port) { endPoint = new DnsEndPoint(host, port); socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); }
internal void Connect() { SocketAsyncEventArgs args = new SocketAsyncEventArgs();
args.UserToken = socket; args.RemoteEndPoint = endPoint; args.Completed += new EventHandler<SocketAsyncEventArgs>(OnConnect);
socket.ConnectAsync(args); autoEvent.WaitOne();
if (args.SocketError != SocketError.Success) throw new SocketException((int)args.SocketError); }
internal void Disconnect() { socket.Close(); }
#region Events
private void OnConnect(object sender, SocketAsyncEventArgs e) { autoEvent.Set(); isConnected = (e.SocketError == SocketError.Success); }
private void OnReceive(object sender, SocketAsyncEventArgs e) { autoSendReceiveEvents[Send].Set(); }
private void OnSend(object sender, SocketAsyncEventArgs e) { autoSendReceiveEvents[Receive].Set();
if (e.SocketError == SocketError.Success) { if (e.LastOperation == SocketAsyncOperation.Send) { Socket handler = e.UserToken as Socket;
byte[] responce = new byte[255]; e.SetBuffer(responce, 0, responce.Length); e.Completed += new EventHandler<SocketAsyncEventArgs>(OnReceive);
handler.ReceiveAsync(e); } } else ProcessError(e); }
#endregion
private void ProcessError(SocketAsyncEventArgs e) { Socket handler = e.UserToken as Socket;
if (handler.Connected) { try { handler.Shutdown(SocketShutdown.Both); } catch (Exception) { } finally { if (handler.Connected) handler.Close(); } }
throw new SocketException((int)e.SocketError); }
internal string SendReceive(string message) { if (isConnected) { byte[] bytes = Encoding.GetEncoding("cp1251").GetBytes(message);
SocketAsyncEventArgs args = new SocketAsyncEventArgs(); args.SetBuffer(bytes, 0, bytes.Length); args.UserToken = socket; args.RemoteEndPoint = endPoint; args.Completed += new EventHandler<SocketAsyncEventArgs>(OnSend);
socket.SendAsync(args); AutoResetEvent.WaitAll(autoSendReceiveEvents);
return Encoding.GetEncoding("cp1251").GetString(args.Buffer, args.Offset, args.BytesTransferred); } else throw new SocketException((int)SocketError.NotConnected); }
public void Dispose() { autoEvent.Close(); autoSendReceiveEvents[Send].Close(); autoSendReceiveEvents[Receive].Close();
if (socket.Connected) socket.Close(); }
}
public partial class Page : UserControl { private SocketClient clntSocket;
public Page() { InitializeComponent();
clntSocket = new SocketClient("127.0.0.1", 8008); }
private void btnConnect_Click(object sender, RoutedEventArgs e) { clntSocket.Connect(); }
private void btnSend_Click(object sender, RoutedEventArgs e) { txtInfo.Text = clntSocket.SendReceive("Hello Server"); }
private void btnReceive_Click(object sender, RoutedEventArgs e) { }
private void btnStop_Click(object sender, RoutedEventArgs e) { clntSocket.Disconnect(); }
}
|
--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
|