Pastie now auto-senses if line-wrap is a bad or good idea. Feedback?
## mark a section (Learn more)
using System; using System.Collections.Generic; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.Net.Sockets; using System.Net; using System.Text; namespace ChatClient { public partial class Page : UserControl { private Socket socket; private byte[] transferBuffer; private SocketAsyncEventArgs sendEventArgs; private static int BUFFER_SIZE = 500; private static int PORT = 4505; private static DnsEndPoint IP_END_POINT = new DnsEndPoint(Application.Current.Host.Source.DnsSafeHost, PORT); public delegate void SetTextCallback(String _text); public Page() { InitializeComponent(); socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); SocketAsyncEventArgs connectEventArgs = new SocketAsyncEventArgs(); connectEventArgs.RemoteEndPoint = IP_END_POINT; connectEventArgs.Completed += new EventHandler<SocketAsyncEventArgs>(connectEventArgs_Completed); socket.ConnectAsync(connectEventArgs); } void connectEventArgs_Completed(object sender, SocketAsyncEventArgs e) { sendEventArgs = new SocketAsyncEventArgs(); sendEventArgs.RemoteEndPoint = IP_END_POINT; e.Completed -= new EventHandler<SocketAsyncEventArgs>(connectEventArgs_Completed); e.Completed += new EventHandler<SocketAsyncEventArgs>(receiveEventArgs_Completed); transferBuffer = new byte[BUFFER_SIZE]; e.SetBuffer(transferBuffer, 0, transferBuffer.Length); socket.ReceiveAsync(e); } void receiveEventArgs_Completed(object sender, SocketAsyncEventArgs e) { String a = Encoding.UTF8.GetString(transferBuffer, e.Offset, e.BytesTransferred); SetText(a); socket.ReceiveAsync(e); } private void SetText(String text) { if (this.Dispatcher.CheckAccess()) receiveBox.Text += text; else this.Dispatcher.BeginInvoke(new SetTextCallback(SetText), text); } private void sendButton_Click(object sender, RoutedEventArgs e) { List<ArraySegment<byte>> l = new List<ArraySegment<byte>>(); l.Add(new ArraySegment<byte>(Encoding.UTF8.GetBytes(sendBox.Text + "\n"))); sendEventArgs.BufferList = l; socket.SendAsync(sendEventArgs); } } }
This paste will be private.
From the Design Piracy series on my blog: