C# Socket


目录

一,网络基础

二,Socket 对象

三,Bind() 绑定与 Connect() 连接

四,Listen() 监听请求连接 和 Accept() 接收连接请求

五,Receive() 与 Send()

六,释放资源

七,IPAddress 和 IPEndPoint

文章按照 Socket 的 创建、连接、传输数据、释放资源的过程来写。给出方法、参数的详细信息。


https://www.cnblogs.com/ysyn/p/3399351.html

https://www.cnblogs.com/wangcq/p/3520400.html


https://docs.microsoft.com/zh-cn/dotnet/api/system.net.sockets.sockettype?view=netframework-4.7.2

ProtocolType

表示协议类型,是一个 enum 类型。

其所有字段如下

协议类型

描述

Ggp 3

网关到网关协议。

Icmp 1

Internet 控制消息协议。

IcmpV6 58

IPv6 的 Internet 控制消息协议。

Idp 22

Internet 数据报协议。

Igmp 2

Internet 组管理协议。

IP 0

Internet 协议。

IPSecAuthenticationHeader 51

IPv6 身份验证标头。 有关详细信息,请参阅https://www.ietf.org 上的 RFC 2292,第 2.2.1 节。

IPSecEncapsulatingSecurityPayload 50

IPv6 封装安全负载标头。

IPv4 4

Internet 协议版本 4。

IPv6 41

Internet 协议版本 6 (IPv6)。

IPv6DestinationOptions 60

IPv6 目标选项标头。

IPv6FragmentHeader 44

IPv6 片段标头。

IPv6HopByHopOptions 0

IPv6 逐跳选项标头。

IPv6NoNextHeader 59

IPv6 无下一个标头。

IPv6RoutingHeader 43

IPv6 路由标头。

Ipx 1000

Internet 数据包交换协议。

ND 77

网络磁盘协议(非正式)。

Pup 12

PARC 通用数据包协议。

Raw 255

原始 IP 数据包协议。

Spx 1256

顺序包交换协议。

SpxII 1257

顺序包交换版本 2 协议。

Tcp 6

传输控制协议。

Udp 17

用户数据报协议。

Unknown -1

未知的协议。

Unspecified 0

未指定的协议。

AddressFamily

表示使用的网络寻址方案,是一个 enum 类型。

地址类型

描述

AppleTalk 16

AppleTalk 地址。

Atm 22

本机 ATM 服务地址。

Banyan 21

Banyan 地址。

Ccitt 10

CCITT 协议(如 X.25)的地址。

Chaos 5

MIT CHAOS 协议的地址。

Cluster 24

Microsoft 群集产品的地址。

DataKit 9

Datakit 协议的地址。

13

直接数据链接接口地址。

DecNet 12

DECnet 地址。

Ecma 8

欧洲计算机制造商协会 (ECMA) 地址。

FireFox 19

FireFox 地址。

HyperChannel 15

NSC Hyperchannel 地址。

Ieee12844 25

IEEE 1284.4 工作组地址。

3

ARPANET IMP 地址。

InterNetwork 2

IP 版本 4 的地址。

InterNetworkV6 23

IP 版本 6 的地址。

Ipx 6

IPX 或 SPX 地址。

Irda 26

IrDA 地址。

Iso 7

ISO 协议的地址。

Lat 14

LAT 地址。

Max 29

MAX 地址。

NetBios 17

NetBios 地址。

NetworkDesigners 28

支持网络设计器 OSI 网关的协议的地址。

NS 6

Xerox NS 协议的地址。

Osi 7

OSI 协议的地址。

Pup 4

PUP 协议的地址。

Sna 11

IBM SNA 地址。

Unix 1

Unix 本地到主机地址。

Unknown -1

未知的地址族。

Unspecified 0

未指定的地址族。

VoiceView 18

VoiceView 地址。

 Socket 官方文档地址

https://docs.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socket?redirectedfrom=MSDN&view=netframework-4.7.2


Receive(Byte[], Int32, Int32, SocketFlags, SocketError)

使用指定的 Socket,从绑定的 SocketFlags 接收数据,将数据存入接收缓冲区。

Receive(Byte[], Int32, Int32, SocketFlags)

使用指定的 Socket,从绑定的 SocketFlags 接收指定的字节数,存入接收缓冲区的指定偏移量位置。

Receive(IList>, SocketFlags, SocketError)

使用指定的 Socket,从绑定的 SocketFlags 接收数据,将数据存入接收缓冲区列表中。

Receive(Byte[], Int32, SocketFlags)

使用指定的 Socket,从绑定的 SocketFlags 接收指定字节数的数据,并将数据存入接收缓冲区。

Receive(Byte[], SocketFlags)

使用指定的 Socket,从绑定的 SocketFlags 接收数据,将数据存入接收缓冲区。

Receive(IList>, SocketFlags)

使用指定的 Socket,从绑定的 SocketFlags 接收数据,将数据存入接收缓冲区列表中。

Receive(IList>)

从绑定的 Socket 接收数据,将数据存入接收缓冲区列表中。

Receive(Byte[])

从绑定的 Socket 套接字接收数据,将数据存入接收缓冲区。

参数

Byte[] buffer 

Byte 类型的数组,它是存储接收到的数据的位置。

Int32 offset 

buffer 参数中的位置,用于存储所接收的数据。

Int32 size

要接收的字节数。

SocketFlags socketFlags

SocketFlags 值的按位组合。

SocketError errorCode

一个 SocketError 对象,它存储套接字错误。

socketFlags 默认值为 0 或 None ,笔者没有搞懂 socketFlags 的应用场景。

返回

返回已成功读取的字节数。

Send()

send()跟Receive()用法相似,

 示例代码如下

            string str = "hello";
            byte[] a = Encoding.UTF8.GetBytes(str);
            send = socket.Send(a, 0);

发送/接收 都是使用 byte[] 字节流,所以接收时要进行转换。


Socket。 接收 Receive 禁用对此接收Socket。 消息和传送 Both 禁用发送和接收对此Socket。

close()

会直接释放资源,Accept 和 Socket 对象都可以使用。使用后对象将彻底释放。


https://docs.microsoft.com/zh-cn/dotnet/api/system.net.ipaddress?view=netframework-4.7.2

IPEndPoint 表示IPAddress对象与端口的绑定

            IPAddress ip = IPAddress.Any;              //把ip地址字符串转换为IPAddress类型的实例
            IPEndPoint ipe = new IPEndPoint(ip, 8000);//用指定的端口和ip初始化IPEndPoint类的新实例

上面的代码,创建一个监控点,端口是 8000,对象是 本地所有IP

另外,此类能够获取查看端口的值范围,除此外,此类没有太大意义。

Microsoft 文档地址 https://docs.microsoft.com/zh-cn/dotnet/api/system.net.ipendpoint?view=netframework-4.7.2

本文转自:https://www.cnblogs.com/whuanle/p/10375526.html

参考: https://www.cnblogs.com/dolphinX/p/3460545.html