,,C#中的Socket编程详解

,,C#中的Socket编程详解

本文详细讲解了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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • 设计一个简单的C#控制台应用程序,C#控制台程序,C# 创建控制台应用程序
  • 深入解析windows第8版,深入解析C#(第4版)
  • 数组代码,c# 数组操作,C# 数组实例介绍(图文)
  • 学会C#要多久,学会c#要多久,c#学习之30分钟学会XAML
  • 回溯法01背包问题c,回溯法求解01背包问题伪代码,C#使用回溯法解决背包问题实例分析
  • xml文件转义字符,xml转意字符,C# XML中的转义字符操作
  • winform 进度条控件,c# 进度条使用
  • winform 进度条控件,c# 进度条使用,C#使用winform实现进度条效果
  • winform backgroundworker,c# isbackground
  • winform backgroundworker,c# isbackground,C# BackgroundWorker用法详解
  • lua与c#交互,lua c#
  • lua与c#交互,lua c#,ToLua框架下C#与Lua代码的互调操作
  • linq c#,linq原理 c#
  • linq c#,linq原理 c#,c#中LINQ的基本用法实例
  • java decimal保留两位小数,sql中decimal函数保留2位小数,C#中decimal保留2位有效小数的实现方法
  • 留言与评论(共有 条评论)
       
    验证码: