C#中Socket通信常用的方法
创建Socket
在C#中创建一个Socket
对象的基本步骤如下:
-
引入命名空间: 首先,确保你的文件顶部包含了以下命名空间的引用:
using System.Net; using System.Net.Sockets;
-
创建Socket实例: 你可以创建一个
Socket
实例,指定协议类型和套接字类型。例如,如果你想要创建一个IPv4的TCP套接字,你可以这样做:Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
AddressFamily.InterNetwork
表示使用IPv4。SocketType.Stream
表示这是一个面向连接的套接字(如TCP)。ProtocolType.Tcp
表示使用TCP协议。
-
绑定Socket: 如果你的服务端需要绑定到特定的端口和IP地址,你可以使用
Bind
方法:IPAddress localIP = IPAddress.Any; // 绑定到所有可用的网络接口 int port = 11000; // 端口号 socket.Bind(new IPEndPoint(localIP, port)); IPEndPoint是.NET框架中的一个类,它表示一个Internet协议(IP)地址和端口号的组合,通常用于指定网络服务的端点。在Socket编程中,IPEndPoint用于绑定套接字到特定的IP地址和端口,或者作为远程服务端点的连接目标。 以下是IPEndPoint的一些常用属性和方法: 属性 Address: 获取或设置IPEndPoint的IP地址。 Port: 获取或设置IPEndPoint的端口号。 构造函数 IPEndPoint(IPAddress address, int port): 创建一个新的IPEndPoint实例,使用指定的IP地址和端口号。
-
监听连接: 在服务端,你需要监听传入的连接请求:
int backlog = 100; // 等待队列的长度 socket.Listen(backlog);
-
接受连接: 服务端使用
Accept
方法接受连接,这将返回一个新的Socket
用于与客户端通信:Socket clientSocket = socket.Accept();
-
连接到服务端: 对于客户端,使用
Connect
方法连接到服务端:IPAddress serverIP = IPAddress.Parse("127.0.0.1"); // 服务端的IP地址 int port = 11000; // 服务端的端口号 socket.Connect(new IPEndPoint(serverIP, port));
-
发送和接收数据: 一旦建立了连接,就可以使用
Send
和Receive
方法来发送和接收数据:byte[] buffer = Encoding.ASCII.GetBytes("Hello, World!"); int bytesSent = socket.Send(buffer); byte[] receiveBuffer = new byte[1024]; int bytesReceived = socket.Receive(receiveBuffer); string receivedText = Encoding.ASCII.GetString(receiveBuffer, 0, bytesReceived);
-
关闭Socket: 完成通信后,应该关闭
Socket
:socket.Shutdown(SocketShutdown.Both); socket.Close();
C#中Socket通信常用的方法
在C#中,使用System.Net.Sockets
命名空间下的Socket
类可以实现网络通信。以下是一些常用的方法和概念:
-
创建Socket:
Socket()
: 创建一个未绑定的套接字。
-
绑定Socket:
Bind(IPAddress localAddress, int port)
: 将套接字绑定到本地IP地址和端口。
-
监听连接:
Listen(int backlog)
: 开始监听传入连接请求,backlog
参数指定等待队列中的最大连接数。
-
接受连接:
Accept()
: 接受传入的连接请求,返回一个新的套接字用于与客户端通信。
-
连接到服务端:
Connect(IPAddress remoteAddress, int port)
: 客户端使用,连接到指定的IP地址和端口的服务端。
-
发送数据:
Send(byte[] buffer, int size, SocketFlags flags)
: 向连接的远程主机发送数据。SendTo(byte[] buffer, int size, SocketFlags flags, EndPoint remoteEP)
: 向指定的远程主机发送数据。
-
接收数据:
Receive(byte[] buffer, int size, SocketFlags flags)
: 接收来自连接的远程主机的数据。ReceiveFrom(byte[] buffer, int size, SocketFlags flags, ref EndPoint remoteEP)
: 从任何远程主机接收数据。
-
异步发送数据:
BeginSend(byte[] buffer, int offset, int size, SocketFlags flags, AsyncCallback callback, object state)
: 开始异步发送数据。
-
异步接收数据:
BeginReceive(byte[] buffer, int offset, int size, SocketFlags flags, AsyncCallback callback, object state)
: 开始异步接收数据。
-
关闭Socket:
Close()
: 关闭套接字。Shutdown(SocketShutdown how)
: 禁用套接字的接收和/或发送操作。
-
错误处理:
Poll(int microseconds, SelectMode mode)
: 检查套接字的状态。Select(ICollection checkRead, ICollection checkWrite, ICollection checkError, int microSeconds)
: 检查一个或多个套接字是否有待处理的输入/输出/错误。
-
获取套接字选项:
GetSocketOption(SocketOptionLevel level, SocketOptionName name)
: 获取套接字的选项值。
-
设置套接字选项:
SetSocketOption(SocketOptionLevel level, SocketOptionName name, bool value)
: 设置套接字的选项。
-
获取和设置超时:
SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, int timeout)
: 设置接收超时。SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, int timeout)
: 设置发送超时。
-
获取和设置缓冲区大小:
SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendBuffer, int size)
: 设置发送缓冲区大小。SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveBuffer, int size)
: 设置接收缓冲区大小。
-
非阻塞模式:
Blocking = false
: 设置套接字为非阻塞模式。
-
处理连接的状态变化:
Connected
: 检查套接字是否已连接。Disconnected
: 检查套接字是否已断开连接。
-
获取远程和本地端点:
RemoteEndPoint
: 获取远程端点。LocalEndPoint
: 获取本地端点。