mirror of https://github.com/coolaj86/fizzbuzz
AJ ONeal
12 years ago
4 changed files with 257 additions and 0 deletions
@ -0,0 +1,27 @@ |
|||
using System.Reflection; |
|||
using System.Runtime.CompilerServices; |
|||
|
|||
// Information about this assembly is defined by the following attributes.
|
|||
// Change them to the values specific to your project.
|
|||
|
|||
[assembly: AssemblyTitle("echo")] |
|||
[assembly: AssemblyDescription("")] |
|||
[assembly: AssemblyConfiguration("")] |
|||
[assembly: AssemblyCompany("")] |
|||
[assembly: AssemblyProduct("")] |
|||
[assembly: AssemblyCopyright("coolaj86")] |
|||
[assembly: AssemblyTrademark("")] |
|||
[assembly: AssemblyCulture("")] |
|||
|
|||
// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
|
|||
// The form "{Major}.{Minor}.*" will automatically update the build and revision,
|
|||
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
|
|||
|
|||
[assembly: AssemblyVersion("1.0.*")] |
|||
|
|||
// The following attributes are used to specify the signing key for the assembly,
|
|||
// if desired. See the Mono documentation for more information about signing.
|
|||
|
|||
//[assembly: AssemblyDelaySign(false)]
|
|||
//[assembly: AssemblyKeyFile("")]
|
|||
|
@ -0,0 +1,168 @@ |
|||
// http://msdn.microsoft.com/en-us/library/fx6588te(v=vs.80).aspx
|
|||
using System; |
|||
using System.Net; |
|||
using System.Net.Sockets; |
|||
using System.Text; |
|||
using System.Threading; |
|||
|
|||
namespace echo |
|||
{ |
|||
// State object for reading client data asynchronously
|
|||
public class StateObject { |
|||
// Client socket.
|
|||
public Socket workSocket = null; |
|||
// Size of receive buffer.
|
|||
public const int BufferSize = 64 * 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() { |
|||
UInt16 port = 11000; |
|||
UInt16 maxConnections = 100; |
|||
|
|||
// 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, port); |
|||
|
|||
// 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(maxConnections); |
|||
|
|||
Console.WriteLine("Listening on {0}:{1}", ipAddress, port); |
|||
|
|||
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; |
|||
try { |
|||
handler.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0, |
|||
new AsyncCallback(ReadCallback), state); |
|||
} catch(Exception e) { |
|||
Console.WriteLine ("oh dear"); |
|||
Console.WriteLine(e.ToString()); |
|||
} |
|||
} |
|||
|
|||
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; |
|||
try { |
|||
bytesRead = handler.EndReceive(ar); |
|||
} catch (Exception e) { |
|||
Console.WriteLine ("Client already disconnected " + e.ToString()); |
|||
return; |
|||
} |
|||
|
|||
if (bytesRead > 0) { |
|||
Console.WriteLine ("some bytes read"); |
|||
// 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); |
|||
} |
|||
} else { |
|||
Console.WriteLine ("0 bytes read"); |
|||
} |
|||
} |
|||
|
|||
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; |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,42 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<Project DefaultTargets="Build" ToolsVersion="3.5" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
|||
<PropertyGroup> |
|||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> |
|||
<Platform Condition=" '$(Platform)' == '' ">x86</Platform> |
|||
<ProductVersion>9.0.21022</ProductVersion> |
|||
<SchemaVersion>2.0</SchemaVersion> |
|||
<ProjectGuid>{3F6FA1C0-DF5D-4F8C-BD3C-2DD5F0D911C5}</ProjectGuid> |
|||
<OutputType>Exe</OutputType> |
|||
<RootNamespace>echo</RootNamespace> |
|||
<AssemblyName>echo</AssemblyName> |
|||
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion> |
|||
</PropertyGroup> |
|||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' "> |
|||
<DebugSymbols>true</DebugSymbols> |
|||
<DebugType>full</DebugType> |
|||
<Optimize>false</Optimize> |
|||
<OutputPath>bin\Debug</OutputPath> |
|||
<DefineConstants>DEBUG;</DefineConstants> |
|||
<ErrorReport>prompt</ErrorReport> |
|||
<WarningLevel>4</WarningLevel> |
|||
<PlatformTarget>x86</PlatformTarget> |
|||
<Externalconsole>true</Externalconsole> |
|||
</PropertyGroup> |
|||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' "> |
|||
<DebugType>none</DebugType> |
|||
<Optimize>true</Optimize> |
|||
<OutputPath>bin\Release</OutputPath> |
|||
<ErrorReport>prompt</ErrorReport> |
|||
<WarningLevel>4</WarningLevel> |
|||
<PlatformTarget>x86</PlatformTarget> |
|||
<Externalconsole>true</Externalconsole> |
|||
</PropertyGroup> |
|||
<ItemGroup> |
|||
<Reference Include="System" /> |
|||
</ItemGroup> |
|||
<ItemGroup> |
|||
<Compile Include="Main.cs" /> |
|||
<Compile Include="AssemblyInfo.cs" /> |
|||
</ItemGroup> |
|||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> |
|||
</Project> |
@ -0,0 +1,20 @@ |
|||
|
|||
Microsoft Visual Studio Solution File, Format Version 10.00 |
|||
# Visual Studio 2008 |
|||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "echo", "echo.csproj", "{3F6FA1C0-DF5D-4F8C-BD3C-2DD5F0D911C5}" |
|||
EndProject |
|||
Global |
|||
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
|||
Debug|x86 = Debug|x86 |
|||
Release|x86 = Release|x86 |
|||
EndGlobalSection |
|||
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
|||
{3F6FA1C0-DF5D-4F8C-BD3C-2DD5F0D911C5}.Debug|x86.ActiveCfg = Debug|x86 |
|||
{3F6FA1C0-DF5D-4F8C-BD3C-2DD5F0D911C5}.Debug|x86.Build.0 = Debug|x86 |
|||
{3F6FA1C0-DF5D-4F8C-BD3C-2DD5F0D911C5}.Release|x86.ActiveCfg = Release|x86 |
|||
{3F6FA1C0-DF5D-4F8C-BD3C-2DD5F0D911C5}.Release|x86.Build.0 = Release|x86 |
|||
EndGlobalSection |
|||
GlobalSection(MonoDevelopProperties) = preSolution |
|||
StartupItem = echo.csproj |
|||
EndGlobalSection |
|||
EndGlobal |
Loading…
Reference in new issue