深入理解Socket通信原理与应用

Socket简介

  • 什么是Socket?

在计算机通信领域,socket被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。

  • Socket的本质

Socket本质是编程接口(API),这也是为什么一般叫Socket编程的原因。对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。

  • Socket的作用

Socket的英文原义是“孔”或“插座”,通常也称作“套接字”,可以用来实现不同虚拟机或不同计算机之间的通信。

Socket编程方式:

socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open->读写write/read->关闭close”模式来操作。Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写lO、打开、关闭),因此Socket也提供了类似于连接(Connect)、关闭连接(Close)、发送接受等方法调用。

数据传输方式常用的有两种:STREAM和DGRAM

  1. STREAM 表示面向连接的数据传输方式。数据可以准确无误地到达另一台计算机,如果损坏或丢失,可以重新发送,但效率相对较慢。
  2. DGRAM 表示无连接的数据传输方式。计算机只管传输数据,不作数据校验,DGRAM 所做的校验工作少,所以效率比 SOCK_STREAM 高。QQ 视频聊天和语音聊天就使用 DGRAM 传输数据,因为首先要保证通信的效率,尽量减小延迟,而数据的正确性是次要的,即使丢失很小的一部分数据,视频和音频也可以正常解析,最多出现噪点或杂音,不会对通信质量有实质的影响

Socket示意图

Socket位于应用层和传输层之间

img

七层架构模型示意图

img

Socket编写步骤

服务器端程序的编写步骤:

第一步:调用socket()函数创建一个用于通信的套接字

第二步:给已经创建的套接字绑定一个端口号,这一般通过设置网络套接口地址和调用bind(函数来实现。

第三步:调用listen()函数使套接字成为一个监听套接字。*监听多少个客户端,假设是listen(10),当第11个客户端连接时会出现连接不上来的情况。*

第四步:调用accept()函数来接受客户端的连接,这是就可以和客户端通信了。accept函数是阻塞主线程的。

第五步:处理客户端的连接请求。再次生成一个套接字,和之前的套接字是不一样的。

第六步:终止连接

客户端程序编写步骤:

第一步:调用socket()函数创建一个用于通信的套接字。

第二步:通过设置套接字地址结构,说明客户端与之通信的服务器的IP地址和端口号。

第三步:调用connect()函数来建立与服务器的连接。

第四步:调用读写函数发送或者接收数据。

第五步:终止连接。

服务器 – 客户端 连接示意图

img

文章参考资料

觉得有帮助可以投喂下博主哦~感谢!
作者:Lincol
本文链接:https://www.lincol29.cn/socket
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0协议转载请注明文章地址及作者哦~

评论

  1. Windows Edge
    1 周前
    2024-6-06 1:19:35

    socket太好用了,使我大脑旋转(doge)

    • GoodBoyboy
      Windows Edge
      1 周前
      2024-6-06 1:20:44

      还记得自己看着mc服务器第三方零碎文档对接服务器获取服务器状态的日子,真是太酸爽了

      • 博主
        GoodBoyboy
        Windows Chrome
        1 周前
        2024-6-06 9:28:05

        厉害!我还是工作以后才接触到,然后去学习这些知识。

        • Lincol
          Windows Edge
          1 周前
          2024-6-06 13:13:57

          哈哈,我是寒假没事开个mc服,看见有人用C++实现了获取服务器状态这个功能,于是没事做也想着能不能用C#也实现一次,然后才开始折腾的,也算是自身需求作为动力吧

        • Lincol
          Windows Edge
          1 周前
          2024-6-06 13:18:04

          当时被TCP分片折腾惨了,查了一堆资料,最后自己测试才发现每次mc服务器返回的数据头前几个byte是每次数据包的长度才弄好(没文档的tcp对接最为致命)

          • 博主
            GoodBoyboy
            Windows Chrome
            1 周前
            2024-6-06 13:40:32

            这个深有体会。我在调用AForge类库的时候,没看官方文档。程序出现bug不知道是什么原因,网上查不到资料。最后去翻阅文档,才发现问题。

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇