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 协议的地址。 |
| DataLink | 13 |
直接数据链接接口地址。 |
| DecNet | 12 |
DECnet 地址。 |
| Ecma | 8 |
欧洲计算机制造商协会 (ECMA) 地址。 |
| FireFox | 19 |
FireFox 地址。 |
| HyperChannel | 15 |
NSC Hyperchannel 地址。 |
| Ieee12844 | 25 |
IEEE 1284.4 工作组地址。 |
| ImpLink | 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
使用指定的 Socket,从绑定的 SocketFlags 接收数据,将数据存入接收缓冲区。
使用指定的 Socket,从绑定的 SocketFlags 接收指定的字节数,存入接收缓冲区的指定偏移量位置。
使用指定的 Socket,从绑定的 SocketFlags 接收数据,将数据存入接收缓冲区列表中。
使用指定的 Socket,从绑定的 SocketFlags 接收指定字节数的数据,并将数据存入接收缓冲区。
使用指定的 Socket,从绑定的 SocketFlags 接收数据,将数据存入接收缓冲区。
使用指定的 Socket,从绑定的 SocketFlags 接收数据,将数据存入接收缓冲区列表中。
从绑定的 Socket 接收数据,将数据存入接收缓冲区列表中。
从绑定的 Socket 套接字接收数据,将数据存入接收缓冲区。
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