首页 > 其他分享 >[工程开发]当我们写一个tcp服务端的时候,我们在写什么?(一)

[工程开发]当我们写一个tcp服务端的时候,我们在写什么?(一)

时间:2023-08-06 22:57:29浏览次数:33  
标签:listenSocket 需要 tcp 服务器 acceptEventArg 我们 服务端

当我们写一个tcp服务器和客户端的时候,我们在写什么?(一)

本篇只聊服务端。

最近想搞一个服务器的协议,然后捏,简单搓个tcp服务器协议看看效果,主要是最近实在是没事干,闲得没事搓个服务器看看,当然了,Qt中的我已经有了,现在我需要的是一个C#上的服务器。

当然了,我写这个服务器不会是从很学术的角度出发,而是从工业的实用角度出发,那就必须要先提一下使用场景:这个服务器的使用场景是在本地局域网环境下的进行数据收发,所以这里我可能就没有做什么所谓的io和补包了,可能就是简单的tcp server

不过无所谓,反正就自己写着玩的

1.需要的接口

当然了,既然要写,那么就得先把接口规定好是不?既然如此,我们来看一下编写完成的库需要哪些接口,首先看服务端:

服务端:需要如下接口

  1. Initialization初始化,也许直接在构造函数中就可以实现了
  2. StartServer开启服务器,也许需要输入ip和端口,也许不需要ip,最好是自己直接检索本地ip执行连接,当然了一定要提供选择,因为一定会存在双网卡的情况。
  3. SocketSetting连接设置(可选),当然了也需要对连接做一些设置,比如缓冲区大小等等
  4. SendData发送数据,当然了,需要能决定向谁发送什么内容,这个是最基本的
  5. RecDataEventHandler接受到数据的事件,当客户端发送来了数据之后肯定是要接受的,还需要一个事件去触发处理
  6. ConnEventHandler连接事件,当客户端连接到之后,肯定是需要一个事件来处理的

需要注意:

  1. 我们当然希望tcp服务器的消息系统是异步的。
  2. 接收的消息理论上是需要一个buffer缓冲区去保存的,以此来接受一个个包,也可以方便我们评判这是否是异常包。

以上就是服务端最基本的接口了,在C++中可能还需要创建socket绑定端口什么的操作,不过在.net的强大原生库之后已经为我们做了很多东西了,所以绑定socket通信实际上相当简单,如下所示:

private void StartListen(string ipAddress, int port)
{
	IPAddress localIpAddress = IPAddress.Parse(ipAddress);
	IPEndPoint localEndPoint = new IPEndPoint(localIpAddress, port);

listenSocket = new Socket(localIpAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
listenSocket.Bind(localEndPoint);

listenSocket.Listen(this.socketSetting.Bakclog);
StartAccept();
}

ok,开始连线后,就需要进入一个循环,也就是这个StartAccept();

 private void StartAccept()
	{
		SocketAsyncEventArgs acceptEventArg;

        if (this.poolOfAcceptSaea.Count > 1)
        {
            try
            {
                acceptEventArg = this.poolOfAcceptSaea.Pop();
            }
            catch
            {
                acceptEventArg = CreateNewSaeaForAccept();
            }
        }
        else
        {
            acceptEventArg = CreateNewSaeaForAccept();
        }

        //开始一个异步操作
        bool willRaiseEvent = listenSocket.AcceptAsync(acceptEventArg);

        //如果是同步完成操作
        if (!willRaiseEvent)
        {
            ProcessAccept(acceptEventArg);
        }
    }

标签:listenSocket,需要,tcp,服务器,acceptEventArg,我们,服务端
From: https://www.cnblogs.com/Leventure/p/17610171.html

相关文章

  • LK-99室温超导激发万万亿市场,将对我们的生活产生哪些影响?
    7月下旬,韩国量子能源研究中心公司相关研究团队在预印本网站上陆续公布两篇类似的论文,宣称一种命名为LK-99的铜掺杂铅磷灰石材料拥有“室温+常压”超导能力,系全世界首款室温常压超导材料。它们的实验方法比较简单,就是把铅、铜、磷这几种材料放到高压环境里烧一下就能烧出来,目前已经......
  • 传奇服务端架设-服务端程序启动教程
    进入D:\mirserver目录运行IGE引擎提供的游戏控制台GameCenter.exe单击“配置向导”选项卡游戏服务端所在目录!:\MirServer游戏数据库名称:HERODB  这就数据库名字就是我们在1.4节讲到的数据库名游戏服务器名称:服务器的名字,会在进入游戏时,和游戏窗口标题栏显示游戏服务器外网......
  • 传奇服务端架设如何正确设置传奇服务端数据库?
    要配置DBC,让程序能够正确访问到数据库打开控制面板(图1.4.1)双击打开BDEAdministrator在菜单栏上选择Object→New弹出对话框.选择数据库驱动程序名字STANDARD标准.在左边输入数据库名字HERODB.数据库名字可以随便取.但服务端设置上要相对应.选择数据库表的路径,之前我们将服......
  • 服务端apk打包教程
    本文我将给大家介绍一个apk打包工具VasDolly的使用介绍、原理以及如何在服务端接入VasDolly进行服务端打渠道包操作。使用介绍VasDolly是一个快速多渠道打包工具,同时支持基于V1和V2签名进行多渠道打包。插件本身会自动检测Apk使用的签名类别,并选择合适的多渠道打......
  • 我们有相遇的时间(time)
    终于还是写到这个了。。。题意:一个平面直角坐标系上,给你六个点,分别是\((0,0),(0,1),(1,0),(1,1),(0,0.5),(1,0.5)\)。你随时可以做两种操作,第一种是选两个点的编号,在这两个点之间得到一条直线,这条直线的编号为上个直线编号加一,第二种选两条有交直线,并得到交点,交点编号为上个点......
  • Linux抓包工具tcpdump详解
    tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpdump存在于基本的Linux系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要......
  • 2023-08-04:村里面一共有 n 栋房子 我们希望通过建造水井和铺设管道来为所有房子供水。
    2023-08-04:村里面一共有n栋房子我们希望通过建造水井和铺设管道来为所有房子供水。对于每个房子i,我们有两种可选的供水方案:一种是直接在房子内建造水井成本为wells[i-1](注意-1,因为索引从0开始)另一种是从另一口井铺设管道引水数组pipes给出了在房子间铺设管道的......
  • 我们已经分享了19期读书交流。
    除了分享技术干货,这三个月我们在B站分享了关于技术,心理,开源,音乐,学习等多个主题的读书分享:《贝叶斯思维》、《思考快与慢》、《被讨厌的勇气》、《伯恩斯新情绪疗法》、《创新的扩散》、《训练思考能力的数学书》、《撬动互联网的开源文化》、《稀缺》、《全球科技通史》、《像TED一......
  • 如何在 CentOS 7 安装 TCP BBR 拥塞算法
    TCPBBR介绍首先对TCPBBR做个介绍。TCPBBR(全称BottleneckBandwidthandRound-trippropagationtime)是由Google设计,于2016年发布的拥塞算法。之前大部分拥塞算法是基于丢包作为判断降低传输速率的信号,而BBR则基于模型主动探测。该算法使用网络最近出站数据分组当时的最......
  • 关于SaaS营销,我们都需要关注的这2个策略,快速打开销售市场
    这清晰地表明SaaS商业模式越来越受欢迎。当然,这在行业也存在着巨大的竞争。SaaS公司很难将自己的服务与竞争对手区分开来,并在行业中脱颖而出。这就是SaaS营销策略可以帮助你的地方。任何一个SaaS公司,都要考虑如何盈利的问题,而且都要组建销售团队通过选招一批有技术背景的销售,......