Socket programmer:
Tcp
Code:
/*----------------------------------------------------------*/ //CopyRight @ WWW.cnblogs.com //Simple Tcp Client. //Leo.wl //2010-09-25 //qq:382448649 /*---------------------------------------------------------*/ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; namespace TcpClient { class Program { [STAThread] static void Main(string[] args) { // //TODO:start // byte[] data = new byte[1024]; Socket newclient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); Console.Write("please input the server ip:"); string ipadd = Console.ReadLine(); Console.WriteLine(); Console.Write("please input the server port:"); int port = Convert.ToInt32(Console.ReadLine()); IPEndPoint ie = new IPEndPoint(IPAddress.Parse(ipadd), port);//服务器的IP和端口 try { //因为客户端只是用来向特定的服务器发送信息,所以不需要绑定本机的IP和端口。不需要监听。 newclient.Connect(ie); } catch (SocketException e) { Console.WriteLine("unable to connect to server"); Console.WriteLine(e.ToString()); return; } int recv = newclient.Receive(data); string stringdata = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(stringdata); while (true) { string input = Console.ReadLine(); if (input == "exit") break; newclient.Send(Encoding.ASCII.GetBytes(input)); data = new byte[1024]; recv = newclient.Receive(data); stringdata = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(stringdata); } Console.WriteLine("disconnect from sercer"); newclient.Shutdown(SocketShutdown.Both); newclient.Close(); } } }
/*----------------------------------------------------------*/ //CopyRight @ WWW.cnblogs.com //Simple Tcp Server. //Leo.wl //2010-09-25 //qq:382448649 /*---------------------------------------------------------*/ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; namespace TcpServer { class Program { [STAThread] static void Main(string[] args) { // // TODO: 在此处添加代码以启动应用程序 // int recv;//用于表示客户端发送的信息长度 byte[] data = new byte[1024];//用于缓存客户端所发送的信息,通过socket传递的信息必须为字节数组 Console.WriteLine("IP: " + IPAddress.Any); IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);//本机预使用的IP和端口 Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); newsock.Bind(ipep);//绑定 newsock.Listen(10);//监听 Console.WriteLine("waiting for a client"); Socket client = newsock.Accept();//当有可用的客户端连接尝试时执行,并返回一个新的socket,用于与客户端之间的通信 IPEndPoint clientip = (IPEndPoint)client.RemoteEndPoint; Console.WriteLine("connect with client:" + clientip.Address + " at port:" + clientip.Port); string welcome = "welcome here!"; data = Encoding.ASCII.GetBytes(welcome); client.Send(data, data.Length, SocketFlags.None);//发送信息 while (true) {//用死循环来不断的从客户端获取信息 data = new byte[1024]; recv = client.Receive(data); Console.WriteLine("recv=" + recv); if (recv == 0)//当信息长度为0,说明客户端连接断开 break; Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); client.Send(data, recv, SocketFlags.None); } Console.WriteLine("Disconnected from" + clientip.Address); client.Close(); newsock.Close(); } } }
UDP Code :
/*----------------------------------------------------------*/ //CopyRight @ WWW.cnblogs.com //Simple Udp Client. //Leo.wl //2010-09-25 //qq:382448649 /*---------------------------------------------------------*/ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; namespace SimpleUdpClient { /// <summary> /// UDP Class /// </summary> class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main(string[] args) { // // TODO: 在此处添加代码以启动应用程序 // byte[] data = new byte[1024];//定义一个数组用来做数据的缓冲区 string input, stringData; IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050); Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); string welcome = "Hello,are you there?"; data = Encoding.ASCII.GetBytes(welcome); server.SendTo(data, data.Length, SocketFlags.None, ipep);//将数据发送到指定的终结点 IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); EndPoint Remote = (EndPoint)sender; data = new byte[1024]; int recv = server.ReceiveFrom(data, ref Remote);//接受来自服务器的数据 Console.WriteLine("Message received from{0}:", Remote.ToString()); Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); while (true)//读取数据 { input = Console.ReadLine();//从键盘读取数据 if (input == "text")//结束标记 { break; } server.SendTo(Encoding.ASCII.GetBytes(input), Remote);//将数据发送到指定的终结点Remote data = new byte[1024]; recv = server.ReceiveFrom(data, ref Remote);//从Remote接受数据 stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(stringData); } Console.WriteLine("Stopping client"); server.Close(); } } }
/*----------------------------------------------------------*/ //CopyRight @ WWW.cnblogs.com //Simple Udp Server. //Leo.wl //2010-09-25 //qq:382448649 /*---------------------------------------------------------*/ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; namespace SimpleUdpServer { class Program { [STAThread] static void Main(string[] args) { // //TODO:start // int recv; byte[] data = new byte[1024]; IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);//定义一网络端点 Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//定义一个Socket newsock.Bind(ipep);//Socket与本地的一个终结点相关联 Console.WriteLine("Waiting for a client.."); IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);//定义要发送的计算机的地址 EndPoint Remote = (EndPoint)(sender);// recv = newsock.ReceiveFrom(data, ref Remote);//接受数据 Console.WriteLine("Message received from{0}:", Remote.ToString()); Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); string welcome = "Welcome to my test server!"; data = Encoding.ASCII.GetBytes(welcome); newsock.SendTo(data, data.Length, SocketFlags.None, Remote); while (true) { data = new byte[1024]; recv = newsock.ReceiveFrom(data, ref Remote); Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); newsock.SendTo(data, recv, SocketFlags.None, Remote); } } } }
Get Mac Address:
/*----------------------------------------------------------*/ //CopyRight @ WWW.cnblogs.com //Simple GetMacTest. //Leo.wl //2010-09-25 //qq:382448649 /*---------------------------------------------------------*/ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; using System.IO; namespace GetMacTest { /// <summary> /// Program is class name. /// Get Remote Client Mac Address. /// </summary> public class Program { int recv = 0; int iRemotePort = 137; string sRemoteAddr = "61.191.148.2"; byte[] data = new byte[1024]; byte[] buffer = new byte[1024]; Socket newsock = null; [STAThread] static void Main(string[] args) { try { Program o = new Program(); Console.WriteLine("Mac Addr : "+ o.GetRemoteMacAddr()); Console.ReadLine(); } catch (Exception ex) { throw new Exception(ex.Message); } } /// <summary> /// 1.发送NetBIOS数据查询包到远程客户端。 /// 2.接受远程客户端返回的NetBIOS数据包。 /// 3.137端口是NetBIOS名称UDP,138端口是NetBIOS数据报UDP,139端口是NetBIOS会话TCP /// </summary> /// <param name="bytes">查询包内容</param> /// <returns></returns> protected byte[] MySendAndReceive(byte[] bytes) { try { IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(sRemoteAddr), iRemotePort);//定义一网络端点 newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//定义一个Socket //newsock.Bind(ipep);//Socket与本地的一个终结点相关联 newsock.SendTo(bytes, bytes.Length, SocketFlags.None, ipep); EndPoint Remote = (EndPoint)(ipep); recv = newsock.ReceiveFrom(data, ref Remote);//接受数据 Console.WriteLine("Message received from: {0} ", Remote.ToString()); Console.WriteLine("接受到的远程NetBIOS数据: "); Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); return data; } catch (IOException ex) { throw new Exception(ex.Message); } catch (Exception ex) { throw new Exception(ex.Message); } } /// <summary> /// NetBIOS查询包结构 /// </summary> /// <returns>NetBIOS查询包</returns> protected byte[] GetQueryCmd() { try { byte[] t_ns = new byte[50]; t_ns[0] = 0x00; t_ns[1] = 0x00; t_ns[2] = 0x00; t_ns[3] = 0x10; t_ns[4] = 0x00; t_ns[5] = 0x01; t_ns[6] = 0x00; t_ns[7] = 0x00; t_ns[8] = 0x00; t_ns[9] = 0x00; t_ns[10] = 0x00; t_ns[11] = 0x00; t_ns[12] = 0x20; t_ns[13] = 0x43; t_ns[14] = 0x4B; for (int i = 15; i < 45; i++) { t_ns[i] = 0x41; } t_ns[45] = 0x00; t_ns[46] = 0x00; t_ns[47] = 0x21; t_ns[48] = 0x00; t_ns[49] = 0x01; return t_ns; } catch (Exception ex) { throw new Exception(ex.Message); } } /// <summary> /// 客户端返回的NetBIOS包中的网卡(MAC)编号。 /// </summary> /// <param name="brevdata">客户端返回的NetBIOS包</param> /// <returns>远程客户端的网卡地址</returns> protected String GetMacAddr(byte[] brevdata) { try { int i = brevdata[56] * 18 + 56; String sAddr = ""; StringBuilder sb = new StringBuilder(17); for (int j = 1; j < 7; j++) { sAddr = Convert.ToInt32((0xFF & brevdata[i + j])).ToString("x"); if (sAddr.Length < 2) { sb.Append(0); } sb.Append(sAddr.ToUpper()); if (j < 6) sb.Append(':'); } return sb.ToString(); } catch (Exception ex) { throw new Exception(ex.Message); } } /// <summary> /// 关闭套接字 /// </summary> protected void MyClose() { try { newsock.Close(); } catch (Exception ex) { throw new Exception(ex.Message); } } /// <summary> /// 查询获得远程网卡地址 /// </summary> /// <returns>远程客户端网卡地址</returns> protected string GetRemoteMacAddr() { try { byte[] bqcmd = GetQueryCmd(); buffer = MySendAndReceive(bqcmd); string remoteMac = GetMacAddr(buffer); MyClose(); return remoteMac; } catch (Exception ex) { throw new Exception(ex.Message); } } } }