V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Sponsored by
LinkedIn
不坐班的神仙工作 · 去任何你想去的地方远程,赚一线城市的工资
2000 个不用出门 Social 的全球远程工作,帮助 V2EX 的小伙伴开启全新的工作方式。
Promoted by LinkedIn
liuguangxuan
V2EX  ›  C++

请教各位 C++大佬,现在网络通信库满天飞,深入学习网络编程相关的内容是否还有必要?

  •  
  •   liuguangxuan · 96 天前 · 3421 次点击
    这是一个创建于 96 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一直对网络编程比较感兴趣,想深入学习,但是学好了,可能顶多做一个网络通信的中间件出来。

    目前 C/C++通信库的轮子已经有很多了,像 libevent 、muduo 、asio 等等。在考虑是否还有必要深入学习这方面的知识。因为人的经历总是有限的。

    所以想请教各位大佬:

    1. 如果学好了网络通信方向的知识,有哪些方面的工作可以从事?
    2. 如果不推荐网络通信方向的话,C++目前有哪些推荐的方向?
    33 条回复    2022-07-23 11:09:56 +08:00
    ggvm
        1
    ggvm  
       96 天前   ❤️ 2
    你这个问题真是令人无语。 和那些学完 CRUD 之后觉得人生很空虚的程序没有任何区别。


    你其实不是有兴趣,你只是隐约的觉得掌握了这些东西之后自己会很牛。

    如果你真的有兴趣,你会去看 nginx 的代码,研究他为什么这么牛。 你也会去看看 libevent 的代码,看看他的设计。或者也会去看看 muduo 的代码,看看作者为啥要重复发明一个轮子。
    thedrwu
        2
    thedrwu  
       96 天前 via Android
    网络通信 ≠ socket+poll/select 编程
    statumer
        3
    statumer  
       96 天前
    网络编程和造 C++ 网络库轮子完全是两码事,先搞懂这个吧。
    ipwx
        4
    ipwx  
       96 天前
    有没有一种可能,通常而言“网络编程”指的是用你说的这些个程序来写性能不错的应用程序。。。
    liuguangxuan
        5
    liuguangxuan  
    OP
       96 天前   ❤️ 12
    @ggvm #1 老哥,你上来就是一顿喷,喷完我了,你倒是上点儿干货啊。

    反复看了好几遍你的回答,我实在搞不懂你在表达什么意思。

    1 、“你这个问题真是令人无语。”

    为什么会令你无语?我对技术和职业发展方向有疑问,在这里问一下同行们,我没觉得有什么不妥,你可以选择回答,也可以选择不回答,为什么你会无语。如果你觉的我问的问题令你无语,你为什么又浪费自己的生命来回答呢?为了教我做人?你问一下自己,你人做的怎么样?

    2 、“ 和那些学完 CRUD 之后觉得人生很空虚的程序没有任何区别。”

    为什么你会觉得学完 CRUD 的人觉得空虚?你当时学完 CRUD 有这种感觉?你为什么又觉得我觉得和他们一样,感觉人生空虚,我仔细看了好几遍我的问题,字里行间哪句能体现出空虚来?

    3 、“你其实不是有兴趣,你只是隐约的觉得掌握了这些东西之后自己会很牛。”

    为什么你会觉得我掌握了这些东西会觉得自己很牛,为什么单纯的通过几句提问就会给一个人贴上这种标签,我的问题哪句表述有觉得自己很牛?我题目上标着“请教各位 C++大佬”,一直保持着谦虚的请教的态度,请你告诉我我那句话体现了觉得自己很牛?另外你上来就喷,我给你贴喷子的标签了吗?我照样称呼你老哥,不明白你为什么会无缘无故的给人乱贴标签。

    4 、“如果你真的有兴趣...看代码。”

    为什么你会得出结论,我没有看过这些代码,请问你是从哪里得出来的结论呢?我看过了 muduo 的代码,但是我还是有这个疑问啊。


    总结:
    1 、如果你觉得我问的问题无聊,你完全可以不回答,没必要浪费生命来回答我的问题啊。

    2 、如果你觉得通过贬低别人能抬高自己的身价,那你错了,除了在家你爸妈让着你,在公司如果你是小领导的话,你的同事们迫于绩效考核让着你,在外面没人惯着你。

    3 、如果你真的很牛,请正面回答问题,如果不会审题,语文没学好,麻烦回家请教一下自己的小学语文老师。

    4 、如果你真的很牛,麻烦拿出来干货来,你的博客、你的 GitHub ,你的开源项目来证明你自己,这里都是技术人员,让大家看看你的技术水平到底怎么样,麻烦不要通过踩底别人的这种幼稚的行为,来提升自己,否则只能会让别人以为你是个无脑的喷子。
    jones2000
        6
    jones2000  
       96 天前
    你先学,学完不就知道了嘛。
    liuguangxuan
        7
    liuguangxuan  
    OP
       96 天前
    @thedrwu #2
    @statumer #3
    @ipwx #4 老哥们,自己不知道网络编程的天花板在哪儿,以后可能从事哪些方面的工作。

    担心如果一直深入学网络编程这个方向的话,会不会就是写一些网络库的轮子,然后给别人调用。

    然而现在网络库的轮子太多了,就算自己造轮子也不一定有人家的好用,所以才会产生疑问,这个方向还要不要继续深入钻下去。要不要换个其他的方向。

    因为自己接触的东西有限,还望各位老哥点拨一下。
    liuguangxuan
        8
    liuguangxuan  
    OP
       96 天前
    @jones2000 #6 人的经历是有限的啊,老哥。担心走弯路,所以先来请教以下有经验的老哥们。😂
    liuguangxuan
        9
    liuguangxuan  
    OP
       96 天前
    @jones2000 #6 经历->精力
    jones2000
        10
    jones2000  
       96 天前
    @liuguangxuan 编程这个东西, 你往一个方向走,总能变成专家的。时间是靠自己挤出来的。
    jones2000
        11
    jones2000  
       96 天前
    @jones2000 前提是你喜欢编程,如果不喜欢就算了。
    meystack
        12
    meystack  
       96 天前   ❤️ 2
    这个我可以告诉你,我以前写过 Windows 下的 IOCP 网络模型,我建议你首先是需要搞明白网络模型的细节。
    然后用别人开源的库,而不是自己造轮子,没那个必要,时间跟精力你就算付出,会有两个问题

    1 、你需要大量的时间来维护和修改自己的模型 BUG
    2 、早晚忘得一干二净!!!
    liuguangxuan
        13
    liuguangxuan  
    OP
       96 天前
    @meystack #12 感谢老哥中肯的回答。我也有这种感觉,所以今天才会提出了这个问题。如果不从事网络相关的开发,老哥有没有更推荐的 C++发展方向?
    janus77
        14
    janus77  
       96 天前
    这个要看你的目的,你是为了找工作而学那就可以学,你是为了纯粹的吸收知识那也可以学,只是为了装逼就别学了,为了学而逼自己找这方面的工作,那也没必要的
    c++一直都是很稳定的需求,没有特别火但是也没有凉凉,按照典型的知识路线去学就行了,不用为了找热点而看工作。c++的主流应用方向一直都是那几个,基础设施建设(数据库操作系统中间件等)、特定行业领域(游戏 图形学 音视频 金融 传统工业制造业)
    meystack
        15
    meystack  
       96 天前
    @liuguangxuan 可以往 C/C++游戏开发的方面去转,普通的就业岗位内卷太严重了
    但是做 C/C++ 网络编程肯定是必学的,如果有底子的话,Windows 下的 IOCP Linux 下的 epoll 都去学习下,
    写个示例入门,再去掌握别人的开源库去开发应用基本没啥大问题!
    youjianchuiyan
        16
    youjianchuiyan  
       96 天前
    这东西也就那么回事。
    ipwx
        17
    ipwx  
       96 天前   ❤️ 3
    @liuguangxuan

    1. 不用太纠结网络编程本身。能看懂各个库的原理(不是代码),尝试写一点小代码(实验性)调通对应原理,就 okay 了。没必要封装个什么新轮子。
    2. 甚至其实你用这些网络库本身能写出来应用已经是调通了对应原理了。调试过程中你就实践了这些知识。
    3. 我不知道网络编程天花板在哪里,因为大部分人都是懂了你说的这些去做别的上层应用的,而且比 CRUD boy 强多了。所以网络编程是提高你的上限去江河湖海耍,而不是让你建一个鱼塘在里面玩的。
    4. 你对于 C++ 的疑问也是同样的思维误区。C++ 在很多很多应用里面都会用到,比如低延迟交易、高吞吐量的业务服务器、图形学相关(比如游戏引擎)、大型专业软件(比如 WPS Office 、Photoshop 等)、数据库系统(你可以不用写个数据库,但你说不定有朝一日需要给 mysql/postgresql 写插件)、算法(传统、AI )等都是重要的组成部分。

    我觉得老哥你的主要关键误区在于,总觉得吃透 “一项技术” 能行了。但现实不是这样的。要离开 CRUD boy 的层次,你需要的是对各种技术都有涉猎,然后再把它们融会贯通,最后会在解决实际问题的部分使用最合适的技术。能用别人的系统(比如 Redis )就不要自己手撸,能用别人的类库(比如 muduo )就不要自己再用 epoll 重新造一个。
    ipwx
        18
    ipwx  
       96 天前   ❤️ 2
    @liuguangxuan 再举个例子,你可以看看 pybind

    https://github.com/pybind/pybind11

    这东西配合 cmake 可以很容易写一写 python 算法扩展类型的项目,然后用比如 FastAPI

    https://fastapi.tiangolo.com/

    就能发布为微服务给前端应用使用了。

    ----

    所以真正的技术是没有那么多条条框框边界的。说实话 pybind 封装算法,也应该封装还算快的算法(比如 1ms 以下延迟)。如果是几秒以上的算法,我个人会直接用 c++ 写一个命令行程序,stdin 读入,然后 fastapi 开 asyncio.subprocess 直接对接到前端。
    Alan1978
        19
    Alan1978  
       96 天前 via Android   ❤️ 1
    建议用成熟的库 这种基础组件要经过大量实际场景的检验 不断的修复 bug 自己造的库只有自己在采坑 bug 有多少什么时候爆出来完全是盲盒
    xsqfjys
        20
    xsqfjys  
       96 天前 via iPhone   ❤️ 1
    先搞定对工作有用的对工资有帮助的,剩下的看个人兴趣
    cnbatch
        21
    cnbatch  
       95 天前   ❤️ 1
    网络通信、网络编程的范围非常大,除了前面大家都提到的,其实还有 OSI 第一层和第二层的部分。

    例如网卡驱动,不但牵涉到 OSI 第一层和第二层,还涉及系统内核编程(不管是 Windows 还是 Linux 或 BSD ,写驱动都要跟内核打交道,绕不开的)。这可不是简单的事情。

    还有 VPN 软件,需要熟悉 OSI 第二层和第三层,因为很大可能需要手动处理 IP 路由分派部分,以及对二层⟷三层的解包 /打包。而 IP 协议还分为 IPv4 和 IPv6 ,相关知识点并不会少。

    既然都提到 IP 路由了,那么还可以提一提各种路由协议。假如以后会进入到网络设备公司干编程的活,那就很有可能需要维护各种路由协议相关的源码,这种情况下路由协议必定需要学,就算不精,也得“知道这个协议是干什么、怎么用的”。
    说起网络设备,那就很大可能需要再学一学 SCTP 。目前有部分较新的路由器(不是指“网关”的那种)、基站不但已经支持 SCTP ,而且还依赖 SCTP 来传输数据(主要是信令)。了解 TCP 和 UDP 的人多得是,但了解 SCTP 的相对较少。万一需要维护 SCTP 相关的源码,那就必须先把 SCTP 搞明白。
    liuguangxuan
        22
    liuguangxuan  
    OP
       95 天前
    @cnbatch #21 多谢老哥,看 UNP 的时候,正好把所有跟 SCTP 相关的章节全跳过了,路由相关的内容对我来说有非常大的知识盲区,看来如果想在这个方向有所发展,还有很长的路要走。

    通过老哥的回答,感觉老哥应该是这方面的专业从业人员,能说说一下这个方向的前景呢?
    iuuu
        23
    iuuu  
       95 天前   ❤️ 1
    @liuguangxuan #5 老哥回复的真好,中文社区最大的问题就是怎么提问都会被怼,也算是特色了 233
    frodez
        24
    frodez  
       95 天前
    有必要,你可以写一个库和其他人的库比试一下,再不济也可以到处打广告吹嘘嘛
    wtdd
        25
    wtdd  
       95 天前
    如果经常使用肯定是有必要了解的,懂工具的原理才能用的更得心应手,当然具体算法细节没必要个个深究
    cnbatch
        26
    cnbatch  
       95 天前
    网络设施方向的前景啊……
    跟互联网行业相比的话,它有 1 个特点:稳定。也许还有“低”薪。(注意我加了双引号)

    网络设备在目前这个时代已经成了基础设施,需求量相对稳定,人员需求也相对稳定,大变化大需求当然也会有(比如未来推行 6G 、7G ,或者有人发展出了新的路由协议),但远不如互联网龙头行业来得频繁、变动那么大。

    同样的还有网络安全,它一直都不可或缺,并且越来越重要。但有一个缺点,这个方向属于“运维”这一块,部分公司要求 7×24 轮班,换句话说,会有通宵夜班。虽然没有什么 996 、007 ,但通宵夜班肯定跑不掉的。
    cnbatch
        27
    cnbatch  
       95 天前
    忘了说,还有编写网络安全软件的,也会用到 C++(当然了,需要懂的还不止 C++)。这样一来,单单理解各种异步网络库绝对不够。就比如专门针对某某 CVE 漏洞报告制作出扫描软件或测试软件,需要的基础知识远超“异步网络库”。

    研究下 Kali Linux 各种内置工具就很好地理解我在说什么了。
    acctv2
        28
    acctv2  
       94 天前 via Android
    你提了一个典型的 X-Y problem ,需求是 X ,换成 Y 的说法提出来了,导致别人容易误解。

    你的核心问题还是 C++网络这个方向好不好找工作吧,前面的说法很容易让人觉得你是基于兴趣使然不是就业需求。
    NeoZephyr
        29
    NeoZephyr  
       94 天前   ❤️ 1
    @liuguangxuan 老哥,怼得好。上来就说教,听着就烦
    TrevorPhillips
        30
    TrevorPhillips  
       94 天前 via Android
    @liuguangxuan 兄弟你这回复太漂亮了,你这种提问被喷的情况我也经常碰到,就是苦于不能漂亮的怼回去,所以请教下如何提升自己的回怼能力,中文区戾气实在太重了
    chenxian352
        31
    chenxian352  
       94 天前
    看到一楼被喷我就安心了。
    segmentlll
        32
    segmentlll  
       77 天前
    以我的经验来谈,网络编程知道大概的概念(ip,tcp,udp....)就可以干活儿了,一般公司都有网络库不会去开荒。
    不过每次面试不管面试官懂不懂 tcp 的那些细节,都会让我讲一遍。
    比如拥塞控制,有几个开发的工作会涉及到这个?
    coon
        33
    coon  
       68 天前
    楼主如果你有想法做金融领域的应用可以 mail 我
    cooncn%gmail

    参见 14 楼老哥的描述
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1078 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 20:48 · PVG 04:48 · LAX 13:48 · JFK 16:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.