-
-
Save leandrosilva/656054 to your computer and use it in GitHub Desktop.
| Sample codes from MSDN library about socket programming, specially the asynchronous approach. | |
| Asynchronous Server Socket Example | |
| http://msdn.microsoft.com/en-us/library/fx6588te.aspx | |
| Asynchronous Client Socket Example | |
| http://msdn.microsoft.com/en-us/library/bew39x2a.aspx | |
| Using an Asynchronous Server Socket | |
| http://msdn.microsoft.com/en-us/library/5w7b7x5f.aspx |
| // Asynchronous Client Socket Example | |
| // http://msdn.microsoft.com/en-us/library/bew39x2a.aspx | |
| using System; | |
| using System.Net; | |
| using System.Net.Sockets; | |
| using System.Threading; | |
| using System.Text; | |
| // State object for receiving data from remote device. | |
| public class StateObject { | |
| // Client socket. | |
| public Socket workSocket = null; | |
| // Size of receive buffer. | |
| public const int BufferSize = 256; | |
| // Receive buffer. | |
| public byte[] buffer = new byte[BufferSize]; | |
| // Received data string. | |
| public StringBuilder sb = new StringBuilder(); | |
| } | |
| public class AsynchronousClient { | |
| // The port number for the remote device. | |
| private const int port = 11000; | |
| // ManualResetEvent instances signal completion. | |
| private static ManualResetEvent connectDone = | |
| new ManualResetEvent(false); | |
| private static ManualResetEvent sendDone = | |
| new ManualResetEvent(false); | |
| private static ManualResetEvent receiveDone = | |
| new ManualResetEvent(false); | |
| // The response from the remote device. | |
| private static String response = String.Empty; | |
| private static void StartClient() { | |
| // Connect to a remote device. | |
| try { | |
| // Establish the remote endpoint for the socket. | |
| // The name of the | |
| // remote device is "host.contoso.com". | |
| IPHostEntry ipHostInfo = Dns.Resolve("host.contoso.com"); | |
| IPAddress ipAddress = ipHostInfo.AddressList[0]; | |
| IPEndPoint remoteEP = new IPEndPoint(ipAddress, port); | |
| // Create a TCP/IP socket. | |
| Socket client = new Socket(AddressFamily.InterNetwork, | |
| SocketType.Stream, ProtocolType.Tcp); | |
| // Connect to the remote endpoint. | |
| client.BeginConnect( remoteEP, | |
| new AsyncCallback(ConnectCallback), client); | |
| connectDone.WaitOne(); | |
| // Send test data to the remote device. | |
| Send(client,"This is a test<EOF>"); | |
| sendDone.WaitOne(); | |
| // Receive the response from the remote device. | |
| Receive(client); | |
| receiveDone.WaitOne(); | |
| // Write the response to the console. | |
| Console.WriteLine("Response received : {0}", response); | |
| // Release the socket. | |
| client.Shutdown(SocketShutdown.Both); | |
| client.Close(); | |
| } catch (Exception e) { | |
| Console.WriteLine(e.ToString()); | |
| } | |
| } | |
| private static void ConnectCallback(IAsyncResult ar) { | |
| try { | |
| // Retrieve the socket from the state object. | |
| Socket client = (Socket) ar.AsyncState; | |
| // Complete the connection. | |
| client.EndConnect(ar); | |
| Console.WriteLine("Socket connected to {0}", | |
| client.RemoteEndPoint.ToString()); | |
| // Signal that the connection has been made. | |
| connectDone.Set(); | |
| } catch (Exception e) { | |
| Console.WriteLine(e.ToString()); | |
| } | |
| } | |
| private static void Receive(Socket client) { | |
| try { | |
| // Create the state object. | |
| StateObject state = new StateObject(); | |
| state.workSocket = client; | |
| // Begin receiving the data from the remote device. | |
| client.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0, | |
| new AsyncCallback(ReceiveCallback), state); | |
| } catch (Exception e) { | |
| Console.WriteLine(e.ToString()); | |
| } | |
| } | |
| private static void ReceiveCallback( IAsyncResult ar ) { | |
| try { | |
| // Retrieve the state object and the client socket | |
| // from the asynchronous state object. | |
| StateObject state = (StateObject) ar.AsyncState; | |
| Socket client = state.workSocket; | |
| // Read data from the remote device. | |
| int bytesRead = client.EndReceive(ar); | |
| if (bytesRead > 0) { | |
| // There might be more data, so store the data received so far. | |
| state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,bytesRead)); | |
| // Get the rest of the data. | |
| client.BeginReceive(state.buffer,0,StateObject.BufferSize,0, | |
| new AsyncCallback(ReceiveCallback), state); | |
| } else { | |
| // All the data has arrived; put it in response. | |
| if (state.sb.Length > 1) { | |
| response = state.sb.ToString(); | |
| } | |
| // Signal that all bytes have been received. | |
| receiveDone.Set(); | |
| } | |
| } catch (Exception e) { | |
| Console.WriteLine(e.ToString()); | |
| } | |
| } | |
| private static void Send(Socket client, String data) { | |
| // Convert the string data to byte data using ASCII encoding. | |
| byte[] byteData = Encoding.ASCII.GetBytes(data); | |
| // Begin sending the data to the remote device. | |
| client.BeginSend(byteData, 0, byteData.Length, 0, | |
| new AsyncCallback(SendCallback), client); | |
| } | |
| private static void SendCallback(IAsyncResult ar) { | |
| try { | |
| // Retrieve the socket from the state object. | |
| Socket client = (Socket) ar.AsyncState; | |
| // Complete sending the data to the remote device. | |
| int bytesSent = client.EndSend(ar); | |
| Console.WriteLine("Sent {0} bytes to server.", bytesSent); | |
| // Signal that all bytes have been sent. | |
| sendDone.Set(); | |
| } catch (Exception e) { | |
| Console.WriteLine(e.ToString()); | |
| } | |
| } | |
| public static int Main(String[] args) { | |
| StartClient(); | |
| return 0; | |
| } | |
| } |
| // Asynchronous Server Socket Example | |
| // http://msdn.microsoft.com/en-us/library/fx6588te.aspx | |
| using System; | |
| using System.Net; | |
| using System.Net.Sockets; | |
| using System.Text; | |
| using System.Threading; | |
| // State object for reading client data asynchronously | |
| public class StateObject { | |
| // Client socket. | |
| public Socket workSocket = null; | |
| // Size of receive buffer. | |
| public const int BufferSize = 1024; | |
| // Receive buffer. | |
| public byte[] buffer = new byte[BufferSize]; | |
| // Received data string. | |
| public StringBuilder sb = new StringBuilder(); | |
| } | |
| public class AsynchronousSocketListener { | |
| // Thread signal. | |
| public static ManualResetEvent allDone = new ManualResetEvent(false); | |
| public AsynchronousSocketListener() { | |
| } | |
| public static void StartListening() { | |
| // Data buffer for incoming data. | |
| byte[] bytes = new Byte[1024]; | |
| // Establish the local endpoint for the socket. | |
| // The DNS name of the computer | |
| // running the listener is "host.contoso.com". | |
| IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName()); | |
| IPAddress ipAddress = ipHostInfo.AddressList[0]; | |
| IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000); | |
| // Create a TCP/IP socket. | |
| Socket listener = new Socket(AddressFamily.InterNetwork, | |
| SocketType.Stream, ProtocolType.Tcp ); | |
| // Bind the socket to the local endpoint and listen for incoming connections. | |
| try { | |
| listener.Bind(localEndPoint); | |
| listener.Listen(100); | |
| while (true) { | |
| // Set the event to nonsignaled state. | |
| allDone.Reset(); | |
| // Start an asynchronous socket to listen for connections. | |
| Console.WriteLine("Waiting for a connection..."); | |
| listener.BeginAccept( | |
| new AsyncCallback(AcceptCallback), | |
| listener ); | |
| // Wait until a connection is made before continuing. | |
| allDone.WaitOne(); | |
| } | |
| } catch (Exception e) { | |
| Console.WriteLine(e.ToString()); | |
| } | |
| Console.WriteLine("\nPress ENTER to continue..."); | |
| Console.Read(); | |
| } | |
| public static void AcceptCallback(IAsyncResult ar) { | |
| // Signal the main thread to continue. | |
| allDone.Set(); | |
| // Get the socket that handles the client request. | |
| Socket listener = (Socket) ar.AsyncState; | |
| Socket handler = listener.EndAccept(ar); | |
| // Create the state object. | |
| StateObject state = new StateObject(); | |
| state.workSocket = handler; | |
| handler.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0, | |
| new AsyncCallback(ReadCallback), state); | |
| } | |
| public static void ReadCallback(IAsyncResult ar) { | |
| String content = String.Empty; | |
| // Retrieve the state object and the handler socket | |
| // from the asynchronous state object. | |
| StateObject state = (StateObject) ar.AsyncState; | |
| Socket handler = state.workSocket; | |
| // Read data from the client socket. | |
| int bytesRead = handler.EndReceive(ar); | |
| if (bytesRead > 0) { | |
| // There might be more data, so store the data received so far. | |
| state.sb.Append(Encoding.ASCII.GetString( | |
| state.buffer,0,bytesRead)); | |
| // Check for end-of-file tag. If it is not there, read | |
| // more data. | |
| content = state.sb.ToString(); | |
| if (content.IndexOf("<EOF>") > -1) { | |
| // All the data has been read from the | |
| // client. Display it on the console. | |
| Console.WriteLine("Read {0} bytes from socket. \n Data : {1}", | |
| content.Length, content ); | |
| // Echo the data back to the client. | |
| Send(handler, content); | |
| } else { | |
| // Not all data received. Get more. | |
| handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, | |
| new AsyncCallback(ReadCallback), state); | |
| } | |
| } | |
| } | |
| private static void Send(Socket handler, String data) { | |
| // Convert the string data to byte data using ASCII encoding. | |
| byte[] byteData = Encoding.ASCII.GetBytes(data); | |
| // Begin sending the data to the remote device. | |
| handler.BeginSend(byteData, 0, byteData.Length, 0, | |
| new AsyncCallback(SendCallback), handler); | |
| } | |
| private static void SendCallback(IAsyncResult ar) { | |
| try { | |
| // Retrieve the socket from the state object. | |
| Socket handler = (Socket) ar.AsyncState; | |
| // Complete sending the data to the remote device. | |
| int bytesSent = handler.EndSend(ar); | |
| Console.WriteLine("Sent {0} bytes to client.", bytesSent); | |
| handler.Shutdown(SocketShutdown.Both); | |
| handler.Close(); | |
| } catch (Exception e) { | |
| Console.WriteLine(e.ToString()); | |
| } | |
| } | |
| public static int Main(String[] args) { | |
| StartListening(); | |
| return 0; | |
| } | |
| } |
i need socket for wp (windose phone). help me please
How to create a RESTful web service for Server.cs
Can you give the source code for that ?
How can I received dynamic message from server, I mean the message is not under a fixed size bytes array
hello sir, I have created server program using visual studio 2015 C#, i am connecting to esp2866. it gets connected. and send data to esp8266 but cant receive. when i use socket.receive( ) method , it waits for data to be received. but i dont want to wait for data. ho do i gete data automatically received?. I dont understand async method.
my code is:
`using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
namespace Wifi_Server_Client_Test
{
public partial class Form1 : Form
{
Socket sck, socket;
byte[] bytes = new byte[1024];
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// Setup Socket
// sck.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
txtHost.Text = GetLocalIP();
btnStp.Enabled = false;
btnCon.Enabled = true;
btnSend.Enabled = false;
// LISTEN FOR RECEPTION---------
TcpListener server = new TcpListener(IPAddress.Parse(txtHost.Text), Convert.ToInt32(HostPort.Text));
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//Start the server
}
private string GetLocalIP()
{
IPHostEntry Host;
Host = Dns.GetHostEntry(Dns.GetHostName());
foreach(IPAddress ip in Host.AddressList)
{if (ip.AddressFamily == AddressFamily.InterNetwork)
return ip.ToString();
}
return ("192.0.0.0");
}
private void Close_Click(object sender, EventArgs e)
{
Close();
}
private void Minimise_Click(object sender, EventArgs e)
{
WindowState = FormWindowState.Minimized;
}
private void btnCon_Click(object sender, EventArgs e)
{
//connecting to client
IPHostEntry Host;
Host = Dns.GetHostEntry(Dns.GetHostName());
IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse(txtClient.Text), Convert.ToInt32(txtPort.Text));
// Setup Socket
sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//connecting to client remote
if (!sck.Connected)
{
sck.Connect(remoteEP);
listMessage.Items.Add("Succssfully Connected to: " + remoteEP.ToString());
btnStp.Enabled = true;
btnCon.Enabled = false;
btnSend.Enabled = true;
}
// Start listening and accept a client.
try {
// Setup a callback to be notified of connection requests
int bytesRec = sck.Receive(bytes);
listMessage.Items.Add("ESP8266 Said:" + Encoding.ASCII.GetString(bytes, 0, bytesRec));
//--------------------------------------
}
catch(Exception ex) { listMessage.Items.Add(ex); }
}
private void btnSend_Click(object sender, EventArgs e)
{
//convert string message to byte[]
ASCIIEncoding aEncoding = new ASCIIEncoding();
byte[] sendingMessage = new byte[1500];
sendingMessage = aEncoding.GetBytes(txtMessage.Text);
//sending encodded byte
sck.Send(sendingMessage);
//sending encodded byte
listMessage.Items.Add("Me: " + txtMessage.Text);
txtMessage.Text = "";
}
private void btnStp_Click(object sender, EventArgs e)
{
sck.Shutdown(SocketShutdown.Both);
sck.Disconnect(true);
sck.Close();
listMessage.Items.Add("Disconnected");
btnStp.Enabled = false;
btnCon.Enabled = true;
btnSend.Enabled = false;
}
}
}
HELP PLEASE.
can i use above code to carry voice information? and i need it to go through the UPD protocol.
can i use above code as windows service? i tried but having issues with while loop and allDone.Set() and allDone.WaitOne()
can i use above code to carry voice information? and i need it to go through the UPD protocol.
Just convert the voice data to base64 and send it as text , then translate back it

thanks for your solution but for reiceieve data replace this code to work correct
private void ReceiveCallback(IAsyncResult ar)
{
try
{
StateObject state = (StateObject)ar.AsyncState;
Socket client = state.workSocket;
int byteRead = client.EndReceive(ar);