您的问题似乎不完整,您是想询问关于C语言编程的某个具体问题吗?比如C语言的语法、编程技巧、项目开发等。请提供更具体的信息,这样我才能给出更准确的回答。

2026-03-31 09:071阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计2622个文字,预计阅读时间需要11分钟。

您的问题似乎不完整,您是想询问关于C语言编程的某个具体问题吗?比如C语言的语法、编程技巧、项目开发等。请提供更具体的信息,这样我才能给出更准确的回答。

Socket是一种应用层与TCP/IP协议族通信的中间软件抽象层,是一组接口。在设计中,Socket实际上是一个门面模式,它将复杂的TCP/IP协议族隐藏在Socket接口之后,对用户透明。

一、socket是什么

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。

二、套接字的工作流程

先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

三、服务端

private void btnListen_Click(object sender, EventArgs e) { IPEndPoint point = new IPEndPoint(IPAddress.Any, 13000);//IPAddress.Any本机任何网卡IP。本机端口查看netstat -an //服务端Socket定义 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Bind(point); //绑定IP socket.Listen(10);//启动监听。最大监听数,同一个时间点过来10个客户端,排队 ShowMsg("服务器开始监听"); Thread thread = new Thread(AcceptInfo); thread.Start(socket); } //记录通信用的Socket Dictionary<string, Socket> dic = new Dictionary<string, Socket>(); // private Socket client; void AcceptInfo(object o) { Socket socket = o as Socket; while (true) { //通信用socket try { Socket clientSocket = socket.Accept();//如果客户端有请求,生成一个新的Socket string point = clientSocket.RemoteEndPoint.ToString(); ShowMsg(point + "连接客户端成功!"); dic.Add(point, clientSocket); //接收消息 Thread th = new Thread(ReceiveMsg); th.Start(clientSocket); } catch (Exception ex) { break; } } socket.Close(); } //接收消息 void ReceiveMsg(object socket) { Socket clientSocket = socket as Socket; while (true) { //接收客户端发送过来的数据 try { //定义byte数组存放从客户端接收过来的数据 byte[] buffer = new byte[1024 * 1024]; int n = clientSocket.Receive(buffer);//将接收过来的数据放到buffer中,并返回实际接受数据的长度 //将字节转换成字符串 string words = Encoding.Unicode.GetString(buffer, 0, n); Console.WriteLine(clientSocket.RemoteEndPoint.ToString() + ":" + words); byte[] msg = Encoding.Unicode.GetBytes(words); clientSocket.Send(msg);//发送数据,字节数组 } catch (Exception ex) { break; } } clientSocket.Shutdown(SocketShutdown.Both);//禁止发送和接受数据 clientSocket.Close();//关闭socket,释放资源 }

四、客户端

Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint point = new IPEndPoint("127.0.0.1", 13000));//连接到的服务端IP clientSocket.Connect(point);//连接到服务器 ShowMsg("连接成功"); ShowMsg("服务器" + client.RemoteEndPoint.ToString()); ShowMsg("客户端:" + client.LocalEndPoint.ToString()); Thread th = new Thread(ReceiveMsg);//连接成功后,就可以接收服务器发送的信息了 th.IsBackground = true; th.Start(); clientSocket.Shutdown(SocketShutdown.Both);//禁止发送和接受数据 clientSocket.Close();//关闭socket,释放资源

五、Socket对象的成员

1、属性

名称说明AddressFamily获取 Socket 的地址族。Available获取已经从网络接收且可供读取的数据量。Blocking获取或设置一个值,该值指示 Socket 是否处于阻止模式。Connected获取一个值,该值指示 Socket 是在上次 Send 还是 Receive 操作时连接到远程主机。Handle获取 Socket 的操作系统句柄。LocalEndPoint获取本地终结点。RemoteEndPoint获取远程终结点。ProtocolType获取 Socket 的协议类型。SocketType获取 Socket 的类型。ReceiveBufferSize获取或设置一个值,它指定 Socket 接收缓冲区的大小。ReceiveTimeout获取或设置一个值,该值指定之后同步 Receive 调用将超时的时间长度。SendBufferSize获取或设置一个值,该值指定 Socket 发送缓冲区的大小。SendTimeout获取或设置一个值,该值指定之后同步 Send 调用将超时的时间长度。

2、方法

Accept

名称说明Accept()为新建连接创建新的 Socket。BeginAccept(AsyncCallback, Object) 开始一个异步操作来接受一个传入的连接尝试。EndAccept(Byte[], IAsyncResult)异步接受传入的连接尝试,并创建新的 Socket 对象来处理远程主机通信。 此方法返回包含所传输的初始数据的缓冲区。AcceptAsync(SocketAsyncEventArgs)开始一个异步操作来接受一个传入的连接尝试。

Connect

名称说明Connect(EndPoint)与远程主机建立连接。BeginConnect(EndPoint, AsyncCallback, Object)开始一个对远程主机连接的异步请求。EndConnect(IAsyncResult)结束挂起的异步连接请求。ConnectAsync(SocketAsyncEventArgs)开始一个对远程主机连接的异步请求。

Disconnect

名称说明Disconnect(Boolean)关闭套接字连接并允许重用套接字。BeginDisconnect(Boolean, AsyncCallback, Object)开始异步请求从远程终结点断开连接。EndDisconnect(IAsyncResult)结束挂起的异步断开连接请求。DisconnectAsync(SocketAsyncEventArgs)关闭套接字连接并允许重用套接字。

Receive

您的问题似乎不完整,您是想询问关于C语言编程的某个具体问题吗?比如C语言的语法、编程技巧、项目开发等。请提供更具体的信息,这样我才能给出更准确的回答。

名称说明Receive(Byte[])从绑定的 Socket 套接字接收数据,将数据存入接收缓冲区。BeginReceive(Byte[], Int32, Int32, SocketFlags, AsyncCallback, Object)开始从连接的 Socket 中异步接收数据。EndReceive(IAsyncResult)结束挂起的异步读取。ReceiveAsync(SocketAsyncEventArgs)开始一个异步请求以便从连接的 Socket 对象中接收数据。

ReceiveFrom

名称说明ReceiveFrom(Byte[], EndPoint)将数据报接收到数据缓冲区并存储终结点。BeginReceiveFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object)开始从指定网络设备中异步接收数据。EndReceiveFrom(IAsyncResult, EndPoint)结束挂起的、从特定终结点进行异步读取。ReceiveFromAsync(SocketAsyncEventArgs)开始从指定网络设备中异步接收数据。

ReceiveMessageFrom

名称说明ReceiveMessageFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, IPPacketInformation)使用指定的 SocketFlags 将指定字节数的数据接收到指定的数据缓冲区位置,并存储终结点和数据包信息。BeginReceiveMessageFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object)开始使用指定的 SocketFlags 将指定字节数的数据异步接收到数据缓冲区的指定位置,然后存储终结点和数据包信息。EndReceiveMessageFrom(IAsyncResult, SocketFlags, EndPoint, IPPacketInformation)结束挂起的、从特定终结点进行异步读取。 此方法还显示有关数据包而不是 EndReceiveFrom(IAsyncResult, EndPoint) 的更多信息。ReceiveMessageFromAsync(SocketAsyncEventArgs)开始使用指定的 SocketFlags 将指定字节数的数据异步接收到数据缓冲区的指定位置,并存储终结点和数据包信息。

Send

名称说明Send(Byte[])将数据发送到连接的 Socket。BeginSend(Byte[], Int32, Int32, SocketFlags, AsyncCallback, Object)将数据异步发送到连接的 Socket。EndSend(IAsyncResult)结束挂起的异步发送。SendAsync(SocketAsyncEventArgs)将数据异步发送到连接的 Socket 对象。

SendFile

名称说明SendFile(String)使用 Socket 传输标志,将文件 fileName 发送到连接的 UseDefaultWorkerThread 对象。BeginSendFile(String, AsyncCallback, Object)使用 Socket 标志,将文件 fileName 发送到连接的 UseDefaultWorkerThread 对象。EndSendFile(IAsyncResult)结束文件的挂起异步发送。

SendTo

名称说明SendTo(Byte[], EndPoint)将数据发送到指定的终结点。BeginSendTo(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object)以异步方式将数据发送到特定远程主机。EndSendTo(IAsyncResult)结束挂起的、向指定位置进行的异步发送。SendToAsync(SocketAsyncEventArgs)以异步方式将数据发送到特定远程主机。

其它

名称说明Select(IList, IList, IList, Int32)确定一个或多个套接字的状态。SendPacketsAsync(SocketAsyncEventArgs)将文件集合或者内存中的数据缓冲区以异步方法发送给连接的 Socket 对象。Bind(EndPoint)使 Socket 与一个本地终结点相关联。Listen(Int32)将 Socket 置于侦听状态。CancelConnectAsync(SocketAsyncEventArgs)取消一个对远程主机连接的异步请求。GetSocketOption(SocketOptionLevel, SocketOptionName)返回指定的 Socket 选项的值,表示为一个对象。SetSocketOption(SocketOptionLevel, SocketOptionName, Boolean)将指定的 Socket 选项设置为指定的 Boolean 值。SetIPProtectionLevel(IPProtectionLevel)设置套接字的 IP 保护级别。Shutdown(SocketShutdown)禁用某 Socket 上的发送和接收。Close()关闭 Socket 连接并释放所有关联的资源。Dispose()释放 Socket 类的当前实例所使用的所有资源。

到此这篇关于C#之Socket(套接字)通信的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持自由互联。

本文共计2622个文字,预计阅读时间需要11分钟。

您的问题似乎不完整,您是想询问关于C语言编程的某个具体问题吗?比如C语言的语法、编程技巧、项目开发等。请提供更具体的信息,这样我才能给出更准确的回答。

Socket是一种应用层与TCP/IP协议族通信的中间软件抽象层,是一组接口。在设计中,Socket实际上是一个门面模式,它将复杂的TCP/IP协议族隐藏在Socket接口之后,对用户透明。

一、socket是什么

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。

二、套接字的工作流程

先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

三、服务端

private void btnListen_Click(object sender, EventArgs e) { IPEndPoint point = new IPEndPoint(IPAddress.Any, 13000);//IPAddress.Any本机任何网卡IP。本机端口查看netstat -an //服务端Socket定义 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Bind(point); //绑定IP socket.Listen(10);//启动监听。最大监听数,同一个时间点过来10个客户端,排队 ShowMsg("服务器开始监听"); Thread thread = new Thread(AcceptInfo); thread.Start(socket); } //记录通信用的Socket Dictionary<string, Socket> dic = new Dictionary<string, Socket>(); // private Socket client; void AcceptInfo(object o) { Socket socket = o as Socket; while (true) { //通信用socket try { Socket clientSocket = socket.Accept();//如果客户端有请求,生成一个新的Socket string point = clientSocket.RemoteEndPoint.ToString(); ShowMsg(point + "连接客户端成功!"); dic.Add(point, clientSocket); //接收消息 Thread th = new Thread(ReceiveMsg); th.Start(clientSocket); } catch (Exception ex) { break; } } socket.Close(); } //接收消息 void ReceiveMsg(object socket) { Socket clientSocket = socket as Socket; while (true) { //接收客户端发送过来的数据 try { //定义byte数组存放从客户端接收过来的数据 byte[] buffer = new byte[1024 * 1024]; int n = clientSocket.Receive(buffer);//将接收过来的数据放到buffer中,并返回实际接受数据的长度 //将字节转换成字符串 string words = Encoding.Unicode.GetString(buffer, 0, n); Console.WriteLine(clientSocket.RemoteEndPoint.ToString() + ":" + words); byte[] msg = Encoding.Unicode.GetBytes(words); clientSocket.Send(msg);//发送数据,字节数组 } catch (Exception ex) { break; } } clientSocket.Shutdown(SocketShutdown.Both);//禁止发送和接受数据 clientSocket.Close();//关闭socket,释放资源 }

四、客户端

Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint point = new IPEndPoint("127.0.0.1", 13000));//连接到的服务端IP clientSocket.Connect(point);//连接到服务器 ShowMsg("连接成功"); ShowMsg("服务器" + client.RemoteEndPoint.ToString()); ShowMsg("客户端:" + client.LocalEndPoint.ToString()); Thread th = new Thread(ReceiveMsg);//连接成功后,就可以接收服务器发送的信息了 th.IsBackground = true; th.Start(); clientSocket.Shutdown(SocketShutdown.Both);//禁止发送和接受数据 clientSocket.Close();//关闭socket,释放资源

五、Socket对象的成员

1、属性

名称说明AddressFamily获取 Socket 的地址族。Available获取已经从网络接收且可供读取的数据量。Blocking获取或设置一个值,该值指示 Socket 是否处于阻止模式。Connected获取一个值,该值指示 Socket 是在上次 Send 还是 Receive 操作时连接到远程主机。Handle获取 Socket 的操作系统句柄。LocalEndPoint获取本地终结点。RemoteEndPoint获取远程终结点。ProtocolType获取 Socket 的协议类型。SocketType获取 Socket 的类型。ReceiveBufferSize获取或设置一个值,它指定 Socket 接收缓冲区的大小。ReceiveTimeout获取或设置一个值,该值指定之后同步 Receive 调用将超时的时间长度。SendBufferSize获取或设置一个值,该值指定 Socket 发送缓冲区的大小。SendTimeout获取或设置一个值,该值指定之后同步 Send 调用将超时的时间长度。

2、方法

Accept

名称说明Accept()为新建连接创建新的 Socket。BeginAccept(AsyncCallback, Object) 开始一个异步操作来接受一个传入的连接尝试。EndAccept(Byte[], IAsyncResult)异步接受传入的连接尝试,并创建新的 Socket 对象来处理远程主机通信。 此方法返回包含所传输的初始数据的缓冲区。AcceptAsync(SocketAsyncEventArgs)开始一个异步操作来接受一个传入的连接尝试。

Connect

名称说明Connect(EndPoint)与远程主机建立连接。BeginConnect(EndPoint, AsyncCallback, Object)开始一个对远程主机连接的异步请求。EndConnect(IAsyncResult)结束挂起的异步连接请求。ConnectAsync(SocketAsyncEventArgs)开始一个对远程主机连接的异步请求。

Disconnect

名称说明Disconnect(Boolean)关闭套接字连接并允许重用套接字。BeginDisconnect(Boolean, AsyncCallback, Object)开始异步请求从远程终结点断开连接。EndDisconnect(IAsyncResult)结束挂起的异步断开连接请求。DisconnectAsync(SocketAsyncEventArgs)关闭套接字连接并允许重用套接字。

Receive

您的问题似乎不完整,您是想询问关于C语言编程的某个具体问题吗?比如C语言的语法、编程技巧、项目开发等。请提供更具体的信息,这样我才能给出更准确的回答。

名称说明Receive(Byte[])从绑定的 Socket 套接字接收数据,将数据存入接收缓冲区。BeginReceive(Byte[], Int32, Int32, SocketFlags, AsyncCallback, Object)开始从连接的 Socket 中异步接收数据。EndReceive(IAsyncResult)结束挂起的异步读取。ReceiveAsync(SocketAsyncEventArgs)开始一个异步请求以便从连接的 Socket 对象中接收数据。

ReceiveFrom

名称说明ReceiveFrom(Byte[], EndPoint)将数据报接收到数据缓冲区并存储终结点。BeginReceiveFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object)开始从指定网络设备中异步接收数据。EndReceiveFrom(IAsyncResult, EndPoint)结束挂起的、从特定终结点进行异步读取。ReceiveFromAsync(SocketAsyncEventArgs)开始从指定网络设备中异步接收数据。

ReceiveMessageFrom

名称说明ReceiveMessageFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, IPPacketInformation)使用指定的 SocketFlags 将指定字节数的数据接收到指定的数据缓冲区位置,并存储终结点和数据包信息。BeginReceiveMessageFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object)开始使用指定的 SocketFlags 将指定字节数的数据异步接收到数据缓冲区的指定位置,然后存储终结点和数据包信息。EndReceiveMessageFrom(IAsyncResult, SocketFlags, EndPoint, IPPacketInformation)结束挂起的、从特定终结点进行异步读取。 此方法还显示有关数据包而不是 EndReceiveFrom(IAsyncResult, EndPoint) 的更多信息。ReceiveMessageFromAsync(SocketAsyncEventArgs)开始使用指定的 SocketFlags 将指定字节数的数据异步接收到数据缓冲区的指定位置,并存储终结点和数据包信息。

Send

名称说明Send(Byte[])将数据发送到连接的 Socket。BeginSend(Byte[], Int32, Int32, SocketFlags, AsyncCallback, Object)将数据异步发送到连接的 Socket。EndSend(IAsyncResult)结束挂起的异步发送。SendAsync(SocketAsyncEventArgs)将数据异步发送到连接的 Socket 对象。

SendFile

名称说明SendFile(String)使用 Socket 传输标志,将文件 fileName 发送到连接的 UseDefaultWorkerThread 对象。BeginSendFile(String, AsyncCallback, Object)使用 Socket 标志,将文件 fileName 发送到连接的 UseDefaultWorkerThread 对象。EndSendFile(IAsyncResult)结束文件的挂起异步发送。

SendTo

名称说明SendTo(Byte[], EndPoint)将数据发送到指定的终结点。BeginSendTo(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object)以异步方式将数据发送到特定远程主机。EndSendTo(IAsyncResult)结束挂起的、向指定位置进行的异步发送。SendToAsync(SocketAsyncEventArgs)以异步方式将数据发送到特定远程主机。

其它

名称说明Select(IList, IList, IList, Int32)确定一个或多个套接字的状态。SendPacketsAsync(SocketAsyncEventArgs)将文件集合或者内存中的数据缓冲区以异步方法发送给连接的 Socket 对象。Bind(EndPoint)使 Socket 与一个本地终结点相关联。Listen(Int32)将 Socket 置于侦听状态。CancelConnectAsync(SocketAsyncEventArgs)取消一个对远程主机连接的异步请求。GetSocketOption(SocketOptionLevel, SocketOptionName)返回指定的 Socket 选项的值,表示为一个对象。SetSocketOption(SocketOptionLevel, SocketOptionName, Boolean)将指定的 Socket 选项设置为指定的 Boolean 值。SetIPProtectionLevel(IPProtectionLevel)设置套接字的 IP 保护级别。Shutdown(SocketShutdown)禁用某 Socket 上的发送和接收。Close()关闭 Socket 连接并释放所有关联的资源。Dispose()释放 Socket 类的当前实例所使用的所有资源。

到此这篇关于C#之Socket(套接字)通信的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持自由互联。