iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#中的Socket编程详解
  • 211
分享到

C#中的Socket编程详解

2024-04-02 19:04:59 211人浏览 八月长安
摘要

目录一,网络基础二,Socket 对象SocketTypeProtocolTypeAddressFamily三,Bind() 绑定与 Connect() 连接Bind()Connec

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

一,网络基础

说到 Socket,需要学习一下tcp/IP的知识,了解一下OSI 网络模。

推荐别人的文章,可以很快地了解这些。

https://www.jb51.net/article/234633.htm

Https://www.jb51.net/article/234653.htm

二,Socket 对象

无论是服务器还是客户端,都要创建一个 SOCKET 对象,创建方法一致。

以下是常见的Socket对象创建实例

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//监控 ip4 地址,套接字类型为 TCP ,协议类型为 TCP

其有三个构造函数

public Socket(SocketInfORMation socketInformation);
public Socket(SocketType socketType, ProtocolType protocolType);
public Socket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType);

第一个构造函数,SocketInformation 对象保存的是

Socket(SocketType, ProtocolType)

实质上跟第二个构造函数是一样的。就好像你可以直接把( 一个苹果 , 一个梨)直接放进篮子,也可以先给 水果包装好 再放进篮子里。

下面将解释所有参数的意义。

SocketType

指定 Socket 类的实例表示的套接字类型。

TCP 用主机的IP地址加上主机上的端口号作为 TCP 连接的端点,这种端点就叫做套接字(socket)或插口。 套接字用(IP地址:端口号)表示。

SocketType 是enum 类型,其字段如下

SocketType

  值 

对应的ProtocolType

描述

Unknown

-1

  Unknown              

指定未知的 Socket 类型。

Stream(使用字节流)

1

Tcp

支持可靠、双向、基于连接的字节流

Dgram(使用数据报)

2

Udp

面向无连接

Raw

3

Icmp、lgmp

支持对基础传输协议的访问

Rdm

4

 

支持无连接、面向消息、以可靠方式发送的消息,

并保留数据中的消息边界

Seqpacket

5

 

在网络上提供排序字节流的面向连接且可靠的双向传输

如需了解更详细的资料,请查阅Microsoft文档

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

ProtocolType

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

其所有字段如下

SocketType

  值 

对应的ProtocolType

描述

Unknown

-1

  Unknown              

指定未知的 Socket 类型。

Stream(使用字节流)

1

Tcp

支持可靠、双向、基于连接的字节流

Dgram(使用数据报)

2

Udp

面向无连接

Raw

3

Icmp、lgmp

支持对基础传输协议的访问

Rdm

4

 

支持无连接、面向消息、以可靠方式发送的消息,

并保留数据中的消息边界

Seqpacket

5

 

在网络上提供排序字节流的面向连接且可靠的双向传输

AddressFamily

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

地址类型

描述

AppleTalk16

AppleTalk 地址。

Atm22

本机 ATM 服务地址。

Banyan21

Banyan 地址。

Ccitt10

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

Chaos5

MIT CHAOS 协议的地址。

Cluster24

Microsoft 群集产品的地址。

DataKit9

Datakit 协议的地址。

DataLink13

直接数据链接接口地址。

DecNet12

DECnet 地址。

Ecma8

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

FireFox19

FireFox 地址。

HyperChannel15

NSC Hyperchannel 地址。

Ieee1284425

IEEE 1284.4 工作组地址。

ImpLink3

ARPANET IMP 地址。

InterNetwork2

IP 版本 4 的地址。

InterNetworkV623

IP 版本 6 的地址。

Ipx6

IPX 或 SPX 地址。

Irda26

IrDA 地址。

Iso7

ISO 协议的地址。

Lat14

LAT 地址。

Max29

MAX 地址。

NetBiOS17

NetBios 地址。

NetworkDesigners28

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

NS6

Xerox NS 协议的地址。

Osi7

OSI 协议的地址。

Pup4

PUP 协议的地址。

Sna11

IBM SNA 地址。

Unix1

Unix 本地到主机地址。

Unknown-1

未知的地址族。

Unspecified0

未指定的地址族。

VoiceView18

VoiceView 地址。

Socket 官方文档地址

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

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

Bind() 用于绑定IPEndPoint 对象,在服务端使用。

Connect() 在客户端使用,用于连接服务端。

创建 Socket 对象后,接着绑定本地Socket / 连接服务端。

Bind()

public void Bind (System.Net.EndPoint localEP);

使用方法

        Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPAddress iP = IPAddress.Parse("127.0.0.1");

        //上面不重要,看下面
    //IPEndPoint iPEndPoint = new IPEndPoint(iP, 2300);
    //serverSocket.Bind(iPEndPoint);

       serverSocket.Bind(new IPEndPoint(iP, 2300))

你将在在本地创建IPEndPoint 对象,拥有此 ip:post 的访问权限。目的是绑定本地机器的某个端口,所有经过此端口的数据就归你管了。

Connect()

与远程主机建立连接。Connect() 有四个重载方法,不必关注,只需知道,必需提供 IP 和 Post 两个值。

使用方法

            IPAddress iP = IPAddress.Parse("127.0.0.1");
            IPEndPoint iPEndPoint = new IPEndPoint(iP, 2300);
            Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        //创建与远程主机的连接
            serverSocket.Connect(iPEndPoint);

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

Listen()

监控所有发送到此主机的、特点端口的连接请求。服务端使用,客户端不需要。

public void Listen (int backlog);

使用 Bind() 后,使用 Listen() 方法进行监控,backlog 参数指定可排队等待接受的传入连接的数量,即挂起的连接队列的最大长度。

示例

serverSocket.Listen(10);    //开始监听

Accept()

Accept() 以同步方式监听套接字,在连接请求队列中提取第一个挂起的连接请求,然后创建并返回一个新的 Socket 对象。

代码示例

            //创建终结点(EndPoint)
            IPAddress ip = IPAddress.Any;             
            IPEndPoint ipe = new IPEndPoint(ip, 8000);

            //创建 socket 并开始监听
            Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            serverSocket.Bind(ipe);
            serverSocket.Listen(10);//开始监听

            //接受到client连接,为此连接建立新的socket,并接受信息
            Socket temp = serverSocket.Accept();//为新建连接创建新的socket
//关闭连接
temp.Close();

注意的是,每次建立连接是一个 Accept() 对象,如果你要进行 服务器-客户端互相通讯,应使用同一个 Accept() 对象。每个 Accept 对象都是 从客户端请求建立开始的,期间只要使用同一个 Accept 对象,都可以进行数据传输。

五,Receive() 与 Send()

  • Receive() 接收信息
  • Send() 发送信息

在服务端和客户端都使用这两个方法。

Receive()

使用示例

string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);

直接从微软那复制来的。

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

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

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

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

Receive(IList<ArraySegment<Byte>>, SocketFlags, SocketError)

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

Receive(Byte[], Int32, SocketFlags)

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

Receive(Byte[], SocketFlags)

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

Receive(IList<ArraySegment<Byte>>, SocketFlags)

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

Receive(IList<ArraySegment<Byte>>)

从绑定的 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[] 字节流,所以接收时要进行转换。

六,释放资源

有 Accept 释放和 Socket 的释放。

Accept 是连接对象,一个 Socket 可能有数十个 Accept 连接。

使用 Shutdown( ) 方法可以 禁止 Asscpt 对象的操作(禁用某个 Socket 对象 的发送和接收)。

public void Shutdown (System.Net.Sockets.SocketShutdown how);

SocketShutdown 是一个 enum 类型。

实例

temp.Shutdown(SocketShutdown.Receive);
            //禁止接收
使用描述
发送Send禁止对此发送Socket。
接收Receive禁用对此接收Socket。
消息和传送Both禁用发送和接收对此Socket。

close()

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

七,IPAddress 和IPEndPoint

//引入
using System.Net;

IPAddress 用来处理IP地址、转换IP地址

IPAddress.Parse() 方法可以把以小数点隔分的十进制 IP 表示转化成 IPAddress 类。

IPAddress ip = IPAddress.Parse("127.0.0.1");//把ip地址字符串转换为IPAddress类型的实例

IPAddress提供4个只读字段

  • Any 用于代表本地系统可用的任何IP地址
  • Broadcase用于代表本地网络的IP广播地址
  • Loopback用于代表系统的回送地址
  • None用于代表系统上没有网络接口

关于其类型的使用和全部方法、构造函数等,请查看文档Microsoft文档。

地址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

到此这篇关于C#中的Socket编程详解的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C#中的Socket编程详解

本文链接: https://www.lsjlt.com/news/162547.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#中的Socket编程详解
    目录一,网络基础二,Socket 对象SocketTypeProtocolTypeAddressFamily三,Bind() 绑定与 Connect() 连接Bind()Connec...
    99+
    2024-04-02
  • Python Socket编程详解
    目录背景TCP和UDP协议本质上的区别?TCP/IP协议栈、HTTP协议、Socket之间的区别和联系?TCPSocket服务器的通信过程?socket和websocket之间的联系...
    99+
    2024-04-02
  • socket编程的详细讲解
    目录1:socket大致介绍2:TCP/IP协议3:回过头再来理解socket4:socket的一些接口函数原理5:socket的一个例子,总结上述的问题6:上面例子用到的知识点7:...
    99+
    2024-04-02
  • Java 网络编程socket编程等详解
    网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。java.net包中J2SE的API包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节。java.net包中...
    99+
    2023-05-31
    java 网络编程 socket编程
  • socket编程:WSAStartup函数详解
    WSAStartup函数是Windows Socket API的初始化函数,用于启动Windows Socket的使用。函数原型如下...
    99+
    2023-09-13
    socket
  • 详谈C++ socket网络编程实例
    目录功能源码效果总结 功能 实现基于sokcet的Cpp服务端 TIPS:功能包括接收客户端的数据,向客户端发送数据。 源码 #define _WINSOCK_DEPRECA...
    99+
    2024-04-02
  • TCP Socket 编程原理详解
    TCP(传输控制协议)是一种面向连接的、可靠的传输协议,它通过建立一条虚拟的、全双工的通信管道来实现数据的可靠传输。在TCP Soc...
    99+
    2023-09-01
    原理
  • 详谈C++ socket网络编程实例(2)
    目录功能源码效果总结 功能 完成Cpp客户端简单功能,可收发数据。 Cpp服务端实例地址:【点击跳转】 源码 #define _WINSOCK_DEPRECATED_NO_W...
    99+
    2024-04-02
  • C#网络编程之Socket编程
    目录一:什么是SOCKET套接字分类二:SOCKET相关概念1、端口2、协议2.1 TCP:2.2 UDP三:socket一般应用模式:四:SOCKET通信基本流程图:服务器端:客户...
    99+
    2024-04-02
  • 网络编程—Socket套接字详解
    目录 一、网络编程 1.1、为什么需要网络编程? 1.2、什么是网络编程 1.3、发送端和接收端 ​编辑1.4、请求和响应 ​编辑1.5、客户端和服务端  二、Socket套接字  2.1、概念 2.2、分类  2.2.1、流套接字  2....
    99+
    2023-09-01
    网络 服务器 运维 Socket套接字
  • C/C++编程中const的使用详解
    目录1 概述:const和define的区别2. 修饰局部变量3. 常量指针与指针常量4. 修饰函数的参数5. 修饰函数的返回值6. 修饰全局变量总结1 概述:const和defin...
    99+
    2024-04-02
  • C++项目实战-socket编程
    目录 socket套接字概念 字节序 网络字节序 socket地址 通用socket地址 专用socket地址 IP转换址转换函数  网络套接字函数 socket模型创建流程图(TCP通信流程/CS模型流程图) 出错处理封装函数 soc...
    99+
    2023-09-10
    网络 服务器 tcp/ip c++ linux
  • C#中的GDI+图像编程详解
    一、Graphics GDI+是GDI(Windows Graphics Device Interface)的后继者,它是.NET Framework为操作图形提供的应用程序编程接口...
    99+
    2024-04-02
  • PHP Socket编程过程的详细介绍
    本篇内容主要讲解“PHP Socket编程过程的详细介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP Socket编程过程的详细介绍”吧!介绍Socket用于进程间通信。进程间通信通常基...
    99+
    2023-06-17
  • C语言实现SOCKET编程
    以下是一个简单的C语言示例,演示了如何使用socket编程创建一个简单的服务器和客户端。在此示例中,服务器将侦听来自客户端的消息并将...
    99+
    2023-09-27
    c语言
  • 老生常谈Java 网络编程 —— Socket 详解
    目录1|0构造socket1. 设定等待建立连接的超时时间2. 设定服务器的地址3. 设定客户端的地址4. 客户连接服务器时可能抛出的异常5. 使用代理服务器6. InetAddre...
    99+
    2023-05-18
    Java  Socket 详解 Java  Socket
  • C/C++ Linux Socket网络编程流程分析
    目录一、Socket简介二、Socket编程基础 1. 网络字节序2. sockaddr数据结构3. IP地址转换函数三、Socket编程函数1. socket函数2.&n...
    99+
    2023-02-06
    C/C++ Linux Socket网络编程 Linux Socket网络编程 Socket网络编程
  • Java使用线程池实现socket编程的方法详解
    目录前言一、一个简单的C/S模型实现1.服务器:2.客户端:二、线程池使用方法1.新建一个线程池2.用Runnable接口实现线程3.创建线程对象并提交至线程池执行三、结合起来四、使...
    99+
    2024-04-02
  • python的socket编程
    转自http://www.oschina.net/question/12_76126 参考http://www.cnblogs.com/waniu/archive/2012/08/08/2628390.html 一个简单的python so...
    99+
    2023-01-31
    python socket
  • socket编程之bind()函数使用示例详解
    目录正文端口号具体是怎么绑定老代码端口被占用的问题解决正文 当你创建了socket之后,你会想要把这个socket和你本机上的某个端口号(port)进行关联。 端口号是内核用来确认将...
    99+
    2022-11-13
    socket编程bind函数 socket bind
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作