第13讲 | 套接字Socket:Talk is cheap, show me the code
刘超
该思维导图由 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
《趣谈网络协议》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(141)
- 最新
- 精选
- 明子这章看的很吃力,可能限于篇幅原因,很多细节都没讲清楚。比如,说需要两个socket(监听socket和已连接socket),但没有说为什么需要两个socket,我去查了《Unix 网络编程》才了解原因;而且需要说明的是,只有服务端需要两个socket。
作者回复: 只讲了模式,细节足够一本书了
2019-01-09641 - 起风了001之前有专门学过epoll, 然后就特地看了一下socket和tcp连接的关系, 所以这一章看得比较清晰明白.哈哈, 技术真的是多学就能融会贯通的, 不过本章老师说的主要是linux C编程上的, 现在我用的golang写的话, 很多细节都被隐藏了, 不需要使用epoll, 直接Listen(), 然后Accept() , 有新的连接过来的话就会返回一个Conn, 然后使用golang的goroutine就可以开启一个协程处理这个连接, 一个程序可以开100万个都没压力, 所以也就没有epoll这样的概念了.
作者回复: golang好东西
2019-05-21625 - 灵魂胖子老师,那个UDP 协议的 Socket 程序函数调用过程中的客户端可以不用调用bind()吧?
作者回复: 可以
2018-06-21217 - 蚂蚁内推+v你好,服务端监听socket和连接socket并不是同一个socket,那是同一个端口么,如果是的话,怎么区分收到的数据是哪个socket的
作者回复: 端口是一个端口。这两个socket都属于同一个进程的。内核可以区分用哪个socket接收。代码里面区分就是。就像如果你自己写代码,你就可以让socket i接收而不是socket j。
2019-07-10312 - Observer还的继续啃 Unix 网络编程
作者回复: 对的,这是好书
2019-02-1312 - 灰灰老师,对socket这块一直理解比较抽象,什么情况下需要socket编程,我印象中从来没写过。盼复
作者回复: 很多地方啊,可能都是框架做好了,但是看框架的源代码,还是能看到的
2018-06-1910 - 小可爱我有个问题就是,数据来了之后服务端怎么知道这个数据是属于哪个socket呢?
作者回复: 端口
2019-08-1038 - 星文友select由文件描述fd_set限制 epoll 由文件描述符数量限制 两个差异很大吗
作者回复: 大,文件描述符更大,fdset小的多
2018-06-168 - 臭猫Udp编程中,服务端只用一个socket收发所有客户端信息好,还是为每个客户端都分配一个socket好呢?
作者回复: 一个
2019-01-115 - 扬~UDP的socket的调用过程中,为什么没有listen呢,要不应用程序怎么监听此端口?要不怎么把UDP的包发往监听此端口的应用程序呢?基于UDP的方式会不会因为连接数过多,造成服务器处理压力增大从而延迟增高呢?因为他们共用一个端口,而不是像TCP那样会复制一个套接字随机分配一个端口用于数据接受和发送。我不知道我说的对不对,希望老师能够解答一下困惑。
作者回复: udp没有状态,所以不存在监听这个状态,内存里没有保存连接的任何信息,不占用资源,所以不存在连接数过多的压力,顶多是把网卡打满
2018-11-0225
收起评论