软件编程
位置:首页>> 软件编程>> C#编程>> C#以太网Sockets服务器设计实现

C#以太网Sockets服务器设计实现

作者:cfqq1989  发布时间:2023-10-10 04:38:32 

标签:C#,以太网,Sockets

【1】引用命名空间:

//System.Net.Sockets
using System.Net.Sockets; // 以太网对象
 
// 字段位置
private Socket socket业务;  //对象既可以当服务器,又可以当客户端
TcpListener tcpListener;   //服务器对象
TcpClient tcpClient;       //客户端对象

 Socket 构造函数:

public Socket(SocketInformation 套接字结构体);
public Socket(SocketType 插座类型, ProtocolType 协议类型);
public Socket(AddressFamily 工作组, SocketType 插座类型, ProtocolType 协议类型);

参数介绍:

AddressFamily.InterNetwork=2    用 IPv4
public enum AddressFamily
       {
           Unknown = -1,       //未知的地址族。
           Unspecified = 0,    //未指定的地址族。
           Unix = 1,           //Unix 本地到主机地址。
           InterNetwork = 2,   //IP 版本 4 的地址。
           ImpLink = 3,        //ARPANET IMP 地址。
           Pup = 4,            //PUP 协议的地址。
           Chaos = 5,          //MIT CHAOS 协议的地址。
           NS = 6,             //IPX 或 SPX 地址。
           Ipx = 6,            //Xerox NS 协议的地址。
           Iso = 7,            //ISO 协议的地址。
           Osi = 7,            //OSI 协议的地址。
           Ecma = 8,           //欧洲计算机制造商协会 (ECMA) 地址。
           DataKit = 9,        //Datakit 协议的地址。
           Ccitt = 10,         //CCITT 协议(如 X.25)的地址。
           Sna = 11,           //IBM SNA 地址。
           DecNet = 12,        //DECnet 地址。
           DataLink = 13,      //直接数据链接接口地址。
           Lat = 14,           //LAT 地址。
           HyperChannel = 0xF, //NSC Hyperchannel 地址。
           AppleTalk = 0x10,   //AppleTalk 地址。苹果
           NetBios = 17,       //NetBios 地址。
           VoiceView = 18,     //VoiceView 地址。
           FireFox = 19,       //FireFox 地址。
           Banyan = 21,        //Banyan 地址。
           Atm = 22,           //本机 ATM 服务地址。
           InterNetworkV6 = 23,//IP 版本 6 的地址。
           Cluster = 24,       //Microsoft 群集产品的地址。
           Ieee12844 = 25,     //IEEE 1284.4 工作组地址。
           Irda = 26,          //IrDA 地址。
           NetworkDesigners = 28,//支持网络设计器 OSI 网关的协议的地址。
           Max = 29            //MAX 地址。
       }

 SocketType.Stream

public enum SocketType
   {
       Stream = 1,// Tcp  InterNetwork 地址族 //支持可靠、双向
       Dgram = 2, // Udp  InterNetwork 地址族。
       Raw = 3,
       Rdm = 4,
       Seqpacket = 5,
       Unknown = -1//指定未知的 Socket 类型。
   }

ProtocolType.Tcp

public enum ProtocolType
   {
       IP = 0,
       IPv6HopByHopOptions = 0,
       Icmp = 1,
       Igmp = 2,
       Ggp = 3,
       IPv4 = 4,
       Tcp = 6,
       Pup = 12,
       Udp = 17,
       Idp = 22,
       IPv6 = 41,
       IPv6RoutingHeader = 43,
       IPv6FragmentHeader = 44,
       IPSecEncapsulatingSecurityPayload = 50,
       IPSecAuthenticationHeader = 51,
       IcmpV6 = 58,
       IPv6NoNextHeader = 59,
       IPv6DestinationOptions = 60,
       ND = 77,
       Raw = 0xFF,
       Unspecified = 0,
       Ipx = 1000,
       Spx = 1256,
       SpxII = 1257,
       Unknown = -1
   }

【2】字段: 声明对象

//声明一个Socket对象
private Socket socketSever服务器; // 【1】Socket

// 工作组,套接字类型,协议类型
socketSever服务器 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

【3】初始化:参数

//设置 服务器ip
IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("192.168.0.7"), int.Parse(12345));
           try
           {
               socketSever服务器.Bind(ipe);// 【2】Bind 绑定本地ip
           }
           catch (Exception ex)
           {
               //写入日志
              MessageBox.Show("服务器开启失败:"+ex.Message);
               return;
           }
// 调用listen()函数监听,业务窗口(同时办理业务窗口数)// 同时占线数量
socketSever服务器.Listen(10);// 【3】Listen

Task.Run(new Action(() => //开线程,使主线程能退到ui层
        {
            客户登录业务(); // 【4】Accpet
        }));

按钮_启动服务.Enabled = false;
private void 客户登录业务()
       {
           while (true)
           {
               //等待客户
               Socket socketClient客户 = socketSever服务器.Accept();// 【4】Accpet

//客户来了
               string client客户IP地址 = socketClient客户.RemoteEndPoint.ToString();

客户电话簿.Add(client客户IP地址, socketClient客户);

占线刷新(client客户IP地址, true);

Task.Run(new Action(() => //第2队线程
               {
                  Receive客户经理(socketClient客户);
               }));
           }
       }
private void Receive客户经理(Socket socketClient)
       {
           while (true)
           {
               // 创建一个缓冲区
               byte[] buffer = new byte[1024 * 1024 * 10];
               int length = -1;

// 客户ip
               string client = socketClient.RemoteEndPoint.ToString();

// 等待客户发言
               try
               {
                   length = socketClient.Receive(buffer);
               }
               catch (Exception)
               {
                 // 下线了
                   占线刷新(client, false);
                   客户电话簿.Remove(client);
                   break;
               }

if (length > 0)
               {// 委托呼叫
                  wt(client,Encoding.UFT8.GetString(buffer,0,length));

}
               else
               {
                // 下线了
                   占线刷新(client, false);
                   客户电话簿.Remove(client);
                   break;
               }
           }
       }

使用以太网

注意:对象不包含0个参数

来源:https://blog.csdn.net/cfqq1989/article/details/121724912

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com