C# 网络编程 套接字

套接字

在这里插入图片描述

套接字是支持TCP/IP协议的网络通信的基本操作单元。可以将套接字看作不同主机间的进程进行双向通信的端点。
上图连接1的一对套接字为:
(192.168.2.23,5000)和(192.168.2.122,8888)
上图连接2的一对套接字为:
(192.168.2.23,5001)和(192.168.2.122,8888)
对于UDP协议尽管两个进程之间没有建立连接,但是也同样存在发送端点,和接收端点,也同样使用套接字的概念。

套接字的类型

套接字有3种不同的类型:流套接字、数据报套接字和原始套接字。流套接字用来实现面向连接的TCP通信,数据报套接字实现无连接的UDP通信,原始套接字实现IP数据包通信。3种类型的套接字均可以使用System.Net.Sockets命名空间中的Socket类来实现。

Socket类

Socket类包含在System.Net.Sockets命名空间中。
Socket类的构造函数为:

  public Socket(AddressFamily addressFamily, //网络类型 
  				SocketType socketType,       //套接字类型 
  				ProtocolType protocolType);  //使用的协议 

(1)addressFamily
addressFamily表示网络类型,该参数使用AddressFamily枚举指定Socket使用的寻址方案
例如AddressFamily.InterNetwork表示IP版本4的地址。

(2)socketType
socketTyp指定Socket的类型,该参数使用SocketType枚举指定使用哪种套接字。例如:
SocketType.Stream表明连接是基于流套接字的
SocketType.Dgram表示连接是基于数据报套接字
SocketType.Raw表示连接基于原始套接字;

(3)protocolType
protocolType指定Socket使用的协议,该参数使用ProtocolType枚举指定使用哪种协议。例如:
ProtocolType.Tcp表明连接协议是TCP
ProtocolType.Udp表明连接协议是UDP
在这里插入图片描述

面向连接的套接字

在这里插入图片描述
同步TCP编写服务器端程序的一般步骤为:

  1. 创建一个包含采用的网络类型、数据传输类型和协议类型的本地套接字对象,并将其与服务器的IP地址和端口号绑定。这个过程可以通过Socket类。

  2. 在指定的端口进行监听,以便接受客户端连接请求。

  3. 一旦接受了客户端的连接请求,就根据客户端发送的连接信息创建与该客户端对应的Socket对象。

  4. 根据创建的Socket对象,分别与每个连接的客户进行数据传输。

  5. 根据传送信息情况确定是否关闭与对方的连接。

使用同步TCP编写客户端程序的一般步骤为:

  1. 创建一个包含传输过程中采用的网络类型、数据传输类型和协议类型的Socket对象。
  2. 与远程服务器建立连接。
  3. 与服务器进行数据传输。
  4. 完成工作后,向服务器发送关闭信息,并关闭与服务器的连接。
	//1.建立连接(服务器)
	IPHostEntry local = Dns.GetHostByName(Dns.GetHostName());
	IPEndPoint iep = new IPEndPoint(local.AddressList[0], 1180);
	Socket localSocket = new Socket(
	    AddressFamily.InterNetwork, 
	    SocketType.Stream, 
	    ProtocolType.Tcp);
	localSocket.Bind(iep);
	locatSocket.Listen(10);
	Socket clientSocket = localSocket.Accept();

	//2. 发送、接收信息(服务器)	
	Socket clientSocket = localSocket.Accept();
	//建立连接后,利用Send方法向客户端发送信息
	clientSocket.Send(Encoding.ASCII.GetBytes("server send Hello"));
	//接收客户端信息
	byte[] myresult = new Byte[1024];
	int receiveNum = clientSocket.Receive(myresult);
	Console.WriteLine("接收客户端消息:{0}", Encoding.ASCII.GetString(myresult));
	
	//建立连接(客户端)
	IPAddress remoteHost = IPAddress.Parse("192.168.0.1");
	PEndPoint iep = new IPEndPoint(remoteHost, 1180);
	Socket localSocket = new Socket(
	   AddressFamily.InterNetwork, 
	   SocketType.Stream, 
	   ProtocolType.Tcp);
	localSocket.Connect(iep);
	
	//发送、接收信息(客户端)
	//建立连接成功后,向服务器发送信息
	string sendMessage = "client send Message Hello"+DateTime.Now;
	localSocket.Send(Encoding.ASCII.GetBytes(sendMessage));
	Console.WriteLine("向服务器发送消息:{0}", sendMessage);
	//接收服务器信息
	byte[] result = new Byte[1024];
	localSocket.Receive(result);
	Console.WriteLine("接收服务器消息:{0}", Encoding.ASCII.GetString(result));

无连接的套接字

UDP使用无连接的套接字,无连接的套接字不需要在网络设备之间发送连接信息。

在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值