本文详细讲解了C#中的Socket编程,并通过示例代码进行了详细介绍。对大家的学习或者工作都有一定的参考价值,有需要的朋友可以参考一下。
目录
一、网络基础二、sockettypepoctoltypeaddressfamily三、Bind()绑定和Connect()连接Bind()Connect()四、Listen()监听连接请求和Accept()接收连接请求Listen()Accept()五、receive()和Send()Receive()参数返回Send()六、释放资源close()七、Address和IPEndPointIPAddress用于处理IPAddresses和转换IP地址。IPEndPoint表示IP地址对象和端口之间的绑定。文章是按照Socket创建、连接、数据传输、资源释放的过程来写的。给出方法和参数的详细信息。
一,网络基础
说到Socket,你需要了解TCP/IP和OSI网络模型。
推荐别人的文章,可以快速了解。
https://www.jb51.net/article/234633.htm
https://www.jb51.net/article/234653.htm
二,Socket 对象
无论是服务器还是客户端都要创建一个SOCKET对象,创建方法是一致的。
以下是套接字对象创建的常见示例
Socket s=新套接字(AddressFamily。互联网,SocketType。流,协议类型。TCP);
//监听ip4地址,套接字类型为TCP,协议类型为TCP
它有三个构造函数。
公共套接字(Socket information Socket information);
公共套接字(SocketType socketType,protocol type protocol type);
公共套接字(AddressFamily addressFamily,SocketType socketType,protocol type protocol type);
第一个构造函数SocketInformation对象包含
套接字(SocketType,ProtocolType)
它本质上与第二个构造函数相同。就好像你可以直接把(一个苹果,一个梨)放进篮子里,也可以把水果包起来再放进篮子里。
所有参数的含义将在下面解释。
SocketType
指定由Socket类的实例表示的套接字类型。
使用TCP主机的IP地址加上主机上的端口号作为TCP连接的端点。这个端点称为套接字或套接字。套接字由(IP地址:端口号)表示。
SocketType是具有以下字段的枚举类型
SocketType
价值
相应的协议类型
形容
未知的
-1个未知
指定了未知的套接字类型。
流(使用字节流)
一个
传输控制协议
支持可靠、双向、基于连接的字节流
Dgram(使用数据报)
2
用户数据报协议
无连接通信
生的
三
Icmp、lgmp
支持对底层传输协议的访问。
杆盘状膜
四
支持无连接、面向消息和可靠的消息,
并在数据中保留消息边界。
Seqpacket
五
在网络上提供面向连接和可靠的排序字节流双向传输。
有关更多详细信息,请参考Microsoft文档。
地址:3359 docs . Microsoft . com/zh-cn/dot net/API/system . net . sockets . socket type?view=netframework-4.7.2
ProtocolType
表示协议类型,这是一种枚举类型。
所有字段如下
SocketType
价值
相应的协议类型
形容
未知的
-1个未知
指定了未知的套接字类型。
流(使用字节流)
一个
传输控制协议
支持可靠、双向、基于连接的字节流
Dgram(使用数据报)
2
用户数据报协议
无连接通信
生的
三
Icmp、lgmp
支持对底层传输协议的访问。
杆盘状膜
四
支持无连接、面向消息和可靠的消息,
并在数据中保留消息边界。
Seqpacket
五
在网络上提供面向连接和可靠的排序字节流双向传输。
AddressFamily
使用的网络寻址方案是enum类型。
地址类型值描述
AppleTalk16AppleTalk地址。
ATM22本地ATM服务地址。
榕树21的地址。
CCITT协议的CCITT 10地址(如X.25)。
Chaos5MIT混沌协议的地址。
Microsoft群集产品的地址。
DataKit9Datakit协议的地址。
数据链路13直接数据链路接口地址。
DecNet12DECnet地址
Ecma8欧洲计算机制造商协会(Ecma)地址。
FireFox19FireFox地址。
HyperChannel15NSC Hyperchannel的地址。
Ieee1284425IEEE 1284.4工作组地址。
ImpLink3ARPANET IMP地址。
网际2IP版本4的地址。
网际V623IP版本6的地址。
Ipx6IPX或SPX地址。
Irda26IrDA地址。
7 ISO ISO协议的地址。
Lat14LAT地址。
max 29最大地址。
NetBios17NetBios地址。
NetworkDesigners28支持网络设计者OSI网关协议的地址。
NS6Xerox NS协议的地址。
7地址Osi7OSI协议。
Pup4PUP协议的地址。
Sna11IBM SNA地址。
1 Unix1Unix本地主机地址。
未知-1个未知的地址族。
未指定0未指定的地址族。
VoiceView18VoiceView地址。
套接字官方文件地址
https://docs . Microsoft . com/zh-cn/dot net/API/system . net . sockets . socket?redirectedfrom=MSDNview=net framework-4 . 7 . 2
三,Bind() 绑定与 Connect() 连接
Bind()用于绑定在服务器端使用的IPEndPoint对象。
Connect()用于客户端连接服务器端。
创建套接字对象后,绑定本地套接字/连接服务器。
Bind()
公共无效绑定(系统。net . EndPoint localEP);
施用方式
Socket serverSocket=新套接字(AddressFamily。互联网,SocketType。流,协议类型。TCP);
iP地址iP=地址。parse(' 127 . 0 . 0 . 1 ');
//上面不重要,看下面
//IPEndPoint IPEndPoint=new IPEndPoint(iP,2300);
//serverSocket。bind(iPEndPoint);
服务器套接字。Bind(新IPEndPoint(iP,2300))
您将在本地创建IPEndPoint对象,并且可以访问此ip:post。目的是绑定本地机器的一个端口,所有通过这个端口的数据都将由你负责。
Connect()
与远程主机建立连接。Connect()有四个重载方法,不用理会,只知道必须提供IP和Post值。
施用方式
iP地址iP=地址。parse(' 127 . 0 . 0 . 1 ');
IPEndPoint IPEndPoint=new IPEndPoint(iP,2300);
Socket serverSocket=新套接字(AddressFamily。互联网,SocketType。流,协议类型。TCP);
//创建与远程主机的连接
服务器套接字。连接(iPEndPoint);
四,Listen() 监听请求连接 和 Accept() 接收连接请求
Listen()
监控发送到该主机特征端口的所有连接请求。由服务器使用,但不由客户端使用。
公共void Listen(int backlog);
使用Bind()后,使用Listen()方法进行监视。backlog参数指定可以排队等待接受的传入连接数,即挂起连接队列的最大长度。
例子
服务器套接字。听(10);//开始监听
Accept()
Accept()同步监听套接字,从连接请求队列中提取第一个挂起的连接请求,然后创建并返回一个新的套接字对象。
代码示例
//创建一个端点。
ip地址ip=地址。任何;
IPEndPoint ipe=新IPEndPoint(ip,8000);
//创建套接字并开始侦听
Socket serverSocket=新套接字(AddressFamily。互联网,SocketType。流,协议类型。TCP);
服务器套接字。bind(ipe);
服务器套接字。听(10);//开始监听
//接受到客户端的连接,为此连接建立新的套接字,并接受信息
套接字温度=服务器套接字。接受();//为新连接创建新套接字
//关闭连接
在…之时close();
请注意,每次建立连接时,它都是一个Accept()对象。如果希望在服务器和客户机之间进行通信,应该使用同一个Accept()对象。每个接受对象都是从客户端的请求开始的,在此期间只要使用同一个接受对象就可以进行数据传输。
五,Receive() 与 Send()
Receive()接收信息Send()发送信息
服务器和客户端都使用这两种方法。
Receive()
用法示例
string recvStr=“”;
byte[] recvBytes=新字节[1024];
int字节;
字节=温度。接收(接收字节,接收字节。长度,0);//接受来自客户端的信息
recvStr=编码。ASCII.GetString(recvBytes,0,bytes);
直接抄袭微软。
Receive (byte [],int32,int32,SocketFlags,socket error)使用指定的套接字从绑定的Socket flags接收数据,并将数据存储在接收缓冲区中。
Receive (byte [],int32,int32,SocketFlags)使用指定的套接字,从绑定的Socket flags接收指定数量的字节,并将其存储在接收缓冲区的指定偏移量位置。
Receive (ilistarraysegmentbyte,SocketFlags,socket error)使用指定的套接字从绑定的Socket flags接收数据,并将数据存储在接收缓冲区列表中。
Receive (byte [],int32,SocketFlags)使用指定的套接字,从绑定的Socket flags接收指定字节数的数据,并将数据存储在接收缓冲区中。
Receive(Byte[],SocketFlags)使用指定的套接字从绑定的SocketFlags接收数据,并将数据存储在接收缓冲区中。
Receive (ilistarraysegmentbyte,SocketFlags)使用指定的套接字从绑定的Socket flags接收数据,并将数据存储在接收缓冲区列表中。
Receive(IListArraySegmentByte)从绑定的套接字接收数据,并将数据存储在接收缓冲区列表中。
Receive(Byte[])从绑定的套接字接收数据,并将数据存储在接收缓冲区中。
参数
字节[]缓冲区
Byte类型的数组,它是存储接收数据的位置。
Int32失调
缓冲区参数中存储接收数据的位置。
Int32尺寸
要接收的字节数。
SocketFlags
SocketFlags值的按位组合。
SocketError错误代码
存储套接字错误的SocketError对象。
socketFlags的默认值是0或者无,所以不了解socketFlags的应用场景。
返回
返回成功读取的字节数。
Send()
Send()类似于Receive(),
示例代码如下
string str=' hello
byte[] a=编码。UTF8 . GetBytes(str);
发送=套接字。发送(a,0);
发送和接收都使用byte[]字节流,所以接收时需要转换。
六,释放资源
有接受释放和套接字释放。
Accept是一个连接对象,一个Socket可能有几十个Accept连接。
使用Shutdown()方法禁止Asscpt对象的操作(禁用Socket对象的发送和接收)。
公共无效关机(系统。net . sockets . socket shut down how);
SocketShutdown是一种枚举类型。
例子
在…之时关闭(SocketShutdown。接收);
//禁止接收
发送带有值描述的Send禁止向此发送套接字。接收接收禁用此接收套接字。和消息传递都禁止发送和接收这个套接字。
close()
资源会直接释放,Accept和Socket对象都可以。使用后,对象将被完全释放。
七,IPAddress 和IPEndPoint
//简介
使用System.Net;
IPAddress 用来处理IP地址、转换IP地址
IP地址。Parse()方法可以将小数点分隔的十进制IP表示转换为IPAddress类。
ip地址ip=地址。parse(' 127 . 0 . 0 . 1 ');//将ip地址字符串转换为ip address类型的实例
IPAddress提供了四个只读字段。
Any用于表示本地系统广播可用的任何IP地址case用于表示本地网络的IP广播地址Loopback用于表示系统的环回地址None用于表示系统上没有网络接口
以供其类型和所有方法、构造函数等使用。请查看文档Microsoft documentation。
地址https://docs . Microsoft . com/zh-cn/dot net/API/system . net . IP address?view=netframework-4.7.2
IPEndPoint 表示IPAddress对象与端口的绑定
ip地址ip=地址。任何;//将ip地址字符串转换为ip address类型的实例
IPEndPoint ipe=新IPEndPoint(ip,8000);//用指定的端口和ip初始化IP终结点类的新实例
上面的代码,创建一个监控点,端口是8000,对象全是本地IP。
另外这个类可以得到视口的取值范围,否则没有太大意义。
微软文档地址是https://docs.microsoft.com/zh-cn/dotnet/API/system.net.IP端点?view=netframework-4.7.2
到目前为止,这篇关于C#中套接字编程的文章已经介绍到这里了。希望对大家的学习有帮助,也希望大家多多支持。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。