趣谈网络协议
刘超
前网易研究院云计算技术部首席架构师
130416 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 51 讲
趣谈网络协议
15
15
1.0x
00:00/00:00
登录|注册

第13讲 | 套接字Socket:Talk is cheap, show me the code

connect函数
accept函数
listen函数
bind函数
epoll函数
select函数
线程处理已连接Socket
线程共享资源
pthread_create函数创建线程
父进程通过子进程ID判断子进程状态
子进程处理已连接Socket
fork函数创建子进程
recvfrom函数
sendto函数
bind函数
TCP和UDP
IPv4和IPv6
Socket结构
文件描述符
客户端
服务端
TCP和UDP
IPv4和IPv6
跨平台和HTTP工作机制的思考题
解决C10K问题的方式
TCP和UDP的Socket编程函数调用过程
IO多路复用方式
多线程方式
多进程方式
基于UDP协议的Socket程序函数调用过程
Socket函数参数设置
Socket在Linux中的表示
基于TCP协议的Socket程序函数调用过程
Socket函数参数设置
总结
服务器如何接更多的项目
UDP协议
TCP协议
套接字Socket编程

该思维导图由 AI 生成,仅供参考

前面讲完了 TCP 和 UDP 协议,还没有上手过,这一节咱们讲讲基于 TCP 和 UDP 协议的 Socket 编程。
在讲 TCP 和 UDP 协议的时候,我们分客户端和服务端,在写程序的时候,我们也同样这样分。
Socket 这个名字很有意思,可以作插口或者插槽讲。虽然我们是写软件程序,但是你可以想象为弄一根网线,一头插在客户端,一头插在服务端,然后进行通信。所以在通信之前,双方都要建立一个 Socket。
在建立 Socket 的时候,应该设置什么参数呢?Socket 编程进行的是端到端的通信,往往意识不到中间经过多少局域网,多少路由器,因而能够设置的参数,也只能是端到端协议之上网络层和传输层的。
在网络层,Socket 函数需要指定到底是 IPv4 还是 IPv6,分别对应设置为 AF_INET 和 AF_INET6。另外,还要指定到底是 TCP 还是 UDP。还记得咱们前面讲过的,TCP 协议是基于数据流的,所以设置为 SOCK_STREAM,而 UDP 是基于数据报的,因而设置为 SOCK_DGRAM。

基于 TCP 协议的 Socket 程序函数调用过程

两端创建了 Socket 之后,接下来的过程中,TCP 和 UDP 稍有不同,我们先来看 TCP。
TCP 的服务端要先监听一个端口,一般是先调用 bind 函数,给这个 Socket 赋予一个 IP 地址和端口。为什么需要端口呢?要知道,你写的是一个应用程序,当一个网络包来的时候,内核要通过 TCP 头里面的这个端口,来找到你这个应用程序,把包给你。为什么要 IP 地址呢?有时候,一台机器会有多个网卡,也就会有多个 IP 地址,你可以选择监听所有的网卡,也可以选择监听一个网卡,这样,只有发给这个网卡的包,才会给你。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了套接字Socket编程的基本原理和实际应用,涵盖了TCP和UDP协议的网络通信编程。在TCP服务端方面,通过bind函数赋予IP地址和端口,调用listen函数进行监听,接受连接请求后调用accept函数处理连接;而客户端通过connect函数发起连接,建立连接后通过read和write函数进行数据读写。相比之下,UDP不需要连接状态,通过sendto和recvfrom函数进行通信。此外,文章还介绍了服务器如何接受更多项目的方法,包括多进程方式,并探讨了TCP连接数的理论值和限制。针对C10K问题,文章提出了多种解决方案,包括多线程方式、IO多路复用以及epoll机制。最后,文章留下了两个思考题,引发读者对跨平台程序实现和HTTP工作机制的思考。总的来说,本文内容涵盖了套接字Socket编程的基本原理和高并发处理的解决方案,对于想要了解网络编程的读者具有很好的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《趣谈网络协议》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(141)

  • 最新
  • 精选
  • 明子
    这章看的很吃力,可能限于篇幅原因,很多细节都没讲清楚。比如,说需要两个socket(监听socket和已连接socket),但没有说为什么需要两个socket,我去查了《Unix 网络编程》才了解原因;而且需要说明的是,只有服务端需要两个socket。

    作者回复: 只讲了模式,细节足够一本书了

    2019-01-09
    6
    41
  • 起风了001
    之前有专门学过epoll, 然后就特地看了一下socket和tcp连接的关系, 所以这一章看得比较清晰明白.哈哈, 技术真的是多学就能融会贯通的, 不过本章老师说的主要是linux C编程上的, 现在我用的golang写的话, 很多细节都被隐藏了, 不需要使用epoll, 直接Listen(), 然后Accept() , 有新的连接过来的话就会返回一个Conn, 然后使用golang的goroutine就可以开启一个协程处理这个连接, 一个程序可以开100万个都没压力, 所以也就没有epoll这样的概念了.

    作者回复: golang好东西

    2019-05-21
    6
    25
  • 灵魂胖子
    老师,那个UDP 协议的 Socket 程序函数调用过程中的客户端可以不用调用bind()吧?

    作者回复: 可以

    2018-06-21
    2
    17
  • 蚂蚁内推+v
    你好,服务端监听socket和连接socket并不是同一个socket,那是同一个端口么,如果是的话,怎么区分收到的数据是哪个socket的

    作者回复: 端口是一个端口。这两个socket都属于同一个进程的。内核可以区分用哪个socket接收。代码里面区分就是。就像如果你自己写代码,你就可以让socket i接收而不是socket j。

    2019-07-10
    3
    12
  • Observer
    还的继续啃 Unix 网络编程

    作者回复: 对的,这是好书

    2019-02-13
    12
  • 灰灰
    老师,对socket这块一直理解比较抽象,什么情况下需要socket编程,我印象中从来没写过。盼复

    作者回复: 很多地方啊,可能都是框架做好了,但是看框架的源代码,还是能看到的

    2018-06-19
    10
  • 小可爱
    我有个问题就是,数据来了之后服务端怎么知道这个数据是属于哪个socket呢?

    作者回复: 端口

    2019-08-10
    3
    8
  • 星文友
    select由文件描述fd_set限制 epoll 由文件描述符数量限制 两个差异很大吗

    作者回复: 大,文件描述符更大,fdset小的多

    2018-06-16
    8
  • 臭猫
    Udp编程中,服务端只用一个socket收发所有客户端信息好,还是为每个客户端都分配一个socket好呢?

    作者回复: 一个

    2019-01-11
    5
  • 扬~
    UDP的socket的调用过程中,为什么没有listen呢,要不应用程序怎么监听此端口?要不怎么把UDP的包发往监听此端口的应用程序呢?基于UDP的方式会不会因为连接数过多,造成服务器处理压力增大从而延迟增高呢?因为他们共用一个端口,而不是像TCP那样会复制一个套接字随机分配一个端口用于数据接受和发送。我不知道我说的对不对,希望老师能够解答一下困惑。

    作者回复: udp没有状态,所以不存在监听这个状态,内存里没有保存连接的任何信息,不占用资源,所以不存在连接数过多的压力,顶多是把网卡打满

    2018-11-02
    2
    5
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部