您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

简述网络编程中的Socket

时间:2021-10-18 12:13:28  来源:  作者:编程行者

当初写第一个网络程序的时候,就是通过搜索,找各种实例把程序拼凑出来的,并没有进行深入的理解。这个东西用了这么多年,是该来沉淀一下了,也检验一下自己对这块知识的掌握程度。

可以说,一个典型的网络程序是离不开socket的,它是系统提供给开发者们进行网络操作的强大武器。

socket又叫套接字,是一系列网络操作的API。它的实现和表现形式又会根据系统平台的不同、编程语言的不同而有所区别,但是实现的功能都是一致的。

socket的创建:

windows平台C版本

SOCKET s = socket(AF_.NET, SOCK_STREAM, IPPROTO_TCP);

C#版本

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

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

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

socket的地址和端口:

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

数据接收:

数据接收是由进程调用socket的接收函数发起的。该函数会向系统提交接收数据的IO请求,该请求的内容包括应用层存放数据的缓冲区,请求的数据尺寸,在缓冲区中存放数据的偏移值。

C# 发起数据接收请求:

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

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

数据发送:

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

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

int sndLen= m_socket.Send(buf);

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

TCP Socket:

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

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

建立服务端,需要创建服务端套接字,为该套接字绑定服务地址和端口,打开被动监听,开始等待连接。

C#版本的服务端建立代码

m_socketServer = CreateSocket_IPV4();
            m_socketServer.Bind(CreateEndPoint(port, null));
            m_socketServer.Listen(10);
            m_conns = new List<IConnection>();
            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);

socket涵盖的内容是非常丰富的,我们在此只是拿出一些代表性的内容来记述。



Tags:Socket   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
upstream websocket {#ip_hash;server ivcp-api.ttt.com;}#For WebSocket define serverserver {listen 9999;server_name localhost;location / {proxy_pass http://ivcp-a...【详细内容】
2022-03-18  Tags: Socket  点击:(218)  评论:(0)  加入收藏
第一次看到 ws:// 和 wss:// 时候,感觉好高级啊,还有这种协议。Websocket 历史WebSocket是在2008年6月诞生的1。经由IEFT标准化后,2009年chrome 4第一个提供了该标准支持,并默认...【详细内容】
2022-03-17  Tags: Socket  点击:(72)  评论:(0)  加入收藏
一、这一大堆关键词之间到底有啥区别?有名字就有定义,理解的前提从来都是对定义有所了解。就好比现在让你形容一下梯形的定义,如果你不知道定义,你就可能把平行四边形当做特殊...【详细内容】
2022-02-25  Tags: Socket  点击:(96)  评论:(0)  加入收藏
一、背景在日常工作中我们经常会使用到代理, 这里记录一下Proxifier和ss5的使用,这两个工具既可以单独使用,也可以配合使用。本文讲解proxifier+ss5配合使用的场景及配置。 二...【详细内容】
2021-11-05  Tags: Socket  点击:(149)  评论:(0)  加入收藏
当初写第一个网络程序的时候,就是通过搜索,找各种实例把程序拼凑出来的,并没有进行深入的理解。这个东西用了这么多年,是该来沉淀一下了,也检验一下自己对这块知识的掌握程度。可...【详细内容】
2021-10-18  Tags: Socket  点击:(139)  评论:(0)  加入收藏
最近工作中需要开发前端操作远程虚拟机的功能,简称 WebShell。基于当前的技术栈为 react+django,调研了一会发现大部分的后端实现都是 django+channels 来实现 websocket 服务。...【详细内容】
2021-09-13  Tags: Socket  点击:(123)  评论:(0)  加入收藏
socket用listen函数监听,listen从英语上理解就是一个"听"函数,实际上它也就是这个意思。我们来看unix网络编程这本书是怎样对它的解释:listen函数把一个未连接的套接字转换成一...【详细内容】
2021-08-13  Tags: Socket  点击:(127)  评论:(0)  加入收藏
TCP客户端:1.建立连接套接字,设置Ip和端口监听,socket()2.建立连接 connect3.write() 获取网络流量对象 发送数据4.read()获取网络流量对象 接收数据5.关闭套接字 TCP服务器端1...【详细内容】
2021-07-08  Tags: Socket  点击:(279)  评论:(0)  加入收藏
我是笑林新记,分享一下我使用C#的一些用法,希望对大家有帮助!欢迎关注:笑林新记Visual Studio版本:Enterprise 2015.net Framework版本:3.51Socket介绍 有粉丝私信说让讲一下局域...【详细内容】
2021-06-28  Tags: Socket  点击:(342)  评论:(0)  加入收藏
前言:作为一个刚踏入职场的实习生,我很幸运参加了某个政府项目,并且在项目中负责一个核心模块功能的开发,而不是从头到尾对数据库的crud。虽然我一直心里抱怨我的工作范围根本...【详细内容】
2021-05-24  Tags: Socket  点击:(321)  评论:(0)  加入收藏
▌简易百科推荐
1. 前言了解响应式编程,首先我们需要了解函数式操作和Stream的操作,下面我们简单的复习一下喽。1.1 常用函数式编程函数式接口中我们先来回顾一下Java中的函数式接口。常见的...【详细内容】
2022-07-15  二哥学Java    Tags:编程   点击:(1)  评论:(0)  加入收藏
在本文中,我们将学习如何使用 Next.js、 Prisma、 Postgres 和 Fastify 构建一个 Full-stack 应用程序。在本文中,我们将学习如何使用 Next.js、 Prisma、 Postgres 和 Fastif...【详细内容】
2022-07-12  qaseven    Tags:全栈   点击:(9)  评论:(0)  加入收藏
好的软件开发网站有哪些?做软件开发哪些网站能提供帮助呢?这些很多做软件开发的小伙伴都会问到的问题。007出海全球社交流量导航网站,整合了多方出海跨境网站资源,为你介绍出海...【详细内容】
2022-07-08  Chuhai007    Tags:软件开发   点击:(10)  评论:(0)  加入收藏
我们用monkey做压力测试后,会保存一个monkey日志,那如果想快速的分析日志中有哪些异常,我们可以用批处理工具进行快速的筛查,我们一起来看看吧。先编写个小脚本,然后修改为bat后...【详细内容】
2022-07-08  溪流涌动    Tags:monkey   点击:(13)  评论:(0)  加入收藏
白盒测试落地实践分为两个大方向,一个是静态分析,一个是动态分析,当然啦,也可以叫做静态测试和动态测试。那我们如何高质量保效率的做好白盒测试呢?Parasoft已经为您准备好了成熟...【详细内容】
2022-07-08  Parasoft中国    Tags:白盒测试   点击:(11)  评论:(0)  加入收藏
Altium Designer 自带脚本功能的开发项目,可以调用官方AD API接口对原理图或者PCB进行自动操作,本文主要分享开发的流程,和一些基本的概念信息,本文介绍的脚本工具例子可以用在P...【详细内容】
2022-07-07  电子工程师伟哥    Tags:Altium Designer   点击:(21)  评论:(0)  加入收藏
一、目录介绍 前置知识点 NIO Netty 的核心组件 Channel Callback Future 和 Promise 事件和 ChannelHandler Hello World二、前置知识点1、NIO首先我们需要回顾一...【详细内容】
2022-07-06  架构师jickly    Tags:聊天系统   点击:(16)  评论:(0)  加入收藏
1.事件流事件流是对事件执行过程的描述,了解事件的执行过程有助于加深对事件的理解,提升开发实践中对事件运用的灵活度。2.捕获和冒泡捕获阶段是【从父到子】的传导过程,冒泡阶...【详细内容】
2022-07-06  金乾坤    Tags:API   点击:(13)  评论:(0)  加入收藏
刷盘策略CommitLog的asyncPutMessage方法中可以看到在写入消息之后,调用了submitFlushRequest方法执行刷盘策略:public class CommitLog { public CompletableFuture<PutMe...【详细内容】
2022-07-06  Java码农之路    Tags:RocketMQ   点击:(16)  评论:(0)  加入收藏
最近读了本好书-《深度学习推荐系统》,读完不觉全身通畅,于是就有了写这篇文章的想法,把自己的理解和总结分享给大家。 本文将按照从算法到工程的顺序,先介绍一下推荐系统整体...【详细内容】
2022-07-05  InfoQ    Tags:推荐系统   点击:(22)  评论:(0)  加入收藏
站内最新
站内热门
站内头条