推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

简述网络编程中的Socket

   2023-07-31 网络整理佚名1260
核心提示:上面两个套接字都是以TCP协议创建的,中的三个参数分别指定了IP层协议类型(IPV4和IPV6),数据交互格式(字节流,数据报等),传输层协议(TCP和UDP)。来自网络的数据到达网卡后,向上经过数据链路层,网络层,到达传输层,然后根据端口确定需要将数据交给哪个进程。数据的发送是进程调用的发送函数发起的。采用TCP实现的网络应用,分为服务端和客户端两种端点类型,每个端的实现都对应着不同调用函数。

当我写第一个网络程序时,我搜索并找到了各种例子来拼凑程序,并没有深入的理解。 用了这么多年这个东西,是时候静下心来检验一下我对这块知识的掌握程度了。

可以说,一个典型的网络程序是离不开的,它是系统为开发者提供网络运营的有力武器。

也称为,是一系列用于网络操作的API。 它的实现和表达会根据不同的系统平台和编程语言而有所不同,但实现的功能是相同的。

创建:

平台C版

SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

C#版本

Socket s=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

上面两个都是用TCP协议创建的,里面的三个参数分别指定了IP层协议类型(IPV4和IPV6)、数据交互格式(字节流、数据报等)、传输层协议(TCP和UDP)。

套接字以文件描述符的形式存在于进程中,实际上是一个用于唯一标识套接字的数字,以不同的形式提供给开发者。

地址和端口:

地址指定了数据交换节点的设备。 如果设备有多个网卡,则该地址指定某个网卡; 端口标识设备上的某个进程。 来自网络的数据到达网卡后,向上经过数据链路层、网络层,到达传输层,然后根据端口确定需要哪个进程来交接数据。

数据接收:

数据接收由进程调用的接收函数发起。 该函数会向系统提交一个接收数据的IO请求。 请求的内容包括应用层存储数据的缓冲区、请求的数据大小以及缓冲区中存储数据的偏移值。

C#发起数据接收请求:

int rcvLen=m_socket.Receive(buf, offset, size, SocketFlags.None);

其中,buf为数据缓冲区,是接收到数据时buf中存储数据的起始地址,size是本次请求的字节大小,是接收成功后实际接收到的字节长度。

数据发送:

数据的发送是由进程调用的发送函数发起的。 该函数会向系统提交发送数据的IO请求,并将数据发送到指定的节点。 请求的内容包括发送数据的内容和长度。

C#发起的数据发送请求(TCP):

int sndLen= m_socket.Send(buf);

其中,buf为发送内容的字节码数组,为实际发送的字节长度。

TCP:

TCP是传输层协议,具有一定的复杂性,其目的是完成数据的可靠传输。 TCP实现的网络应用分为两类端点:服务器和客户端。 每个端点的实现对应不同的调用函数。

服务器端可以接受客户端的连接请求,连接完成后即可进行双向通信。

要建立服务器,需要创建服务器套接字,将服务地址和端口绑定到套接字,启用被动监听,并开始等待连接。

C#版本的服务器端创建代码

m_socketServer = CreateSocket_IPV4();
            m_socketServer.Bind(CreateEndPoint(port, null));
            m_socketServer.Listen(10);
            m_conns = new List();
            Task.Factory.StartNew(() =>
            {
                while (m_running)
                {
                    var s = m_socketServer.Accept();
                    var conn = CreateConnection(s);
                    m_conns.Add(conn);
                    OnConnected?.Invoke(conn);
                }
            });

客户端的操作比较简单,只需要创建一个并向服务器发起连接请求即可。

C#版本的客户端代码

var s = CreateSocket_IPV4();
s.Connect(IPAddress.Parse(ip), port);

涵盖的内容非常丰富,这里我们只取出一些有代表性的内容进行介绍。

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON