using System; using System.Threading; using System.Text; using System.Net; using System.Net.Sockets; public class Server { // used to pass state information to delegate internal class StateObject { internal byte[] sBuffer; internal Socket sSocket; internal StateObject(int size, Socket sock) { sBuffer = new byte[size]; sSocket = sock; } } public static void sendCallback(IAsyncResult asyncSend) { Socket serverSocket = (Socket)asyncSend.AsyncState; int bytesSent = serverSocket.EndSend(asyncSend); Console.WriteLine( ".{0} bytes sent.", bytesSent.ToString() ); } public static void receiveCallback(IAsyncResult asyncReceive) { Socket sSocket = (Socket)asyncReceive.AsyncState; int bytesReceived; bytesReceived = sSocket.EndReceive(asyncReceive); Console.WriteLine( ".{0} bytes received.", bytesReceived.ToString() ); } /* static void SendMessage(Socket serverSocket, int index) { SendMessageB(serverSocket, index); ReceiveMessageB(serverSocket); } static int ReceiveMessage(Socket serverSocket) { int index = ReceiveMessageB(serverSocket); SendMessageB(serverSocket, 0); return(index); } */ static void SendMessage(Socket serverSocket, int index) { byte[] sendBuffer = Encoding.ASCII.GetBytes(index.ToString()); IAsyncResult asyncSend = serverSocket.BeginSend( sendBuffer, 0, sendBuffer.Length, SocketFlags.None, new AsyncCallback(sendCallback), serverSocket); while(asyncSend.IsCompleted==false) { } } static int ReceiveMessage(Socket serverSocket) { byte [] sBuffer = new byte[2]; IAsyncResult asyncReceive; asyncReceive = serverSocket.BeginReceive( sBuffer, 0, sBuffer.Length, SocketFlags.None, new AsyncCallback(receiveCallback), serverSocket); while(asyncReceive.IsCompleted==false) {} int res = 1; try { res = Convert.ToInt32(Encoding.ASCII.GetString(sBuffer)); } catch { } return(res); } static void Main() { foreach(IPAddress current in Dns.Resolve(Dns.GetHostName()).AddressList) Console.Write(current + "\n"); IPAddress ipAddress = Dns.Resolve(Dns.GetHostName()).AddressList[0]; Console.Write("Current ip address is " + ipAddress + "\n"); IPEndPoint ipEndpoint = new IPEndPoint(ipAddress, 58963); Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); listenSocket.Bind(ipEndpoint); listenSocket.Listen(1); while(true) { IAsyncResult asyncAccept = listenSocket.BeginAccept( new AsyncCallback(Server.acceptCallback), listenSocket ); Console.Write("Connection in progress."); while(asyncAccept.IsCompleted==false) { } } // could call listenSocket.EndAccept(asyncAccept) here // instead of in the callback method, but since // EndAccept blocks, the behavior would be similar to // calling the synchronous Accept method } public static void acceptCallback(IAsyncResult asyncAccept) { Socket listenSocket = (Socket)asyncAccept.AsyncState; Socket serverSocket; serverSocket = listenSocket.EndAccept(asyncAccept); // arriving here means the operation completed // (asyncAccept.IsCompleted = true) but not // necessarily successfully if( serverSocket.Connected == false ) { Console.WriteLine( ".server is not connected." ); return; } else Console.WriteLine( ".server is connected." ); // listenSocket.Close(); int ind=1; do { int com = ReceiveMessage (serverSocket); SendMessage (serverSocket, 0); int x = ReceiveMessage(serverSocket); SendMessage (serverSocket, 0); int y = ReceiveMessage(serverSocket); System.Random temp = new Random(); if(com==0) { ind = temp.Next(6); if(ind==0) { SendMessage(serverSocket, 1); serverSocket.Shutdown(SocketShutdown.Both); serverSocket.Close(); } else { SendMessage(serverSocket, 0); ReceiveMessage(serverSocket); SendMessage(serverSocket, temp.Next(4)); int ind2 = temp.Next(6); } } else if(com==1) { int ind2 = temp.Next(6); if(ind2==0)SendMessage(serverSocket, 1); else SendMessage(serverSocket, 0); } else Console.Write("The client does't communicate correctly\n"); } while(ind!=0); } internal static bool writeDot(IAsyncResult ar) { int i = 0; while( ar.IsCompleted == false ) { if( i++ > 3000000 ) { Console.WriteLine("Timed out."); return false; } Console.Write("."); Thread.Sleep(100); } return true; } }