首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    网络编程socket之一

    从今年10月22号开始我的python学习之路,一个月下来,磕磕碰碰,勉勉强强把基础部分算是学完了,一个月走过来,我过着别人看似单调,重复的生活,确实是,每天,每周都是一样的生活模式,早上7点40起床,吃个早餐,8点到达教室,中午1点去吃个午饭,然后回到教室,下午6点去吃个晚饭,然后回到教室,待到晚上11点回家洗个澡睡觉,每天都一样的。我的朋友会问我,这样的生活不无聊吗?我回答是不,我的朋友可能认为两年的军旅生活早就让我习惯了单调无味的生活,我觉得有可能两年军旅生活确实让我有强大的适应性,但我认为最主要的是我真心觉得学习编程语言让我很感兴趣,以前的我感觉网络啊,计算机等这类东西感觉好遥远,根本无法触及,但现在我能去控制它,是多么牛逼的事。前一个月基础部分不算很难,只要逻辑思维跟上,就基本不是问题,而且涛哥真的讲的很好,很有耐心,很感谢涛哥。从这周三开始接触网络编程,一上来就很懵逼,什么ip啊,MAC地址啊,交换机啊,路由器等等关于计算机和网络的东西真的让我很萌,根本不知道是啥,相当于重新认知新事物,但几天学习下来,感觉这类东西是要学习的,但对于现阶段的我来说,不用太深入去专研,而主要是的是学会网络编程过程,接下来,我就把这几天所学到知识跟大家分享一下。

    02

    Linux系统下socket编程之socket接口介绍(一)

    其实在写这篇文章开始之前,原本想打算先介绍一下TCP/IP协议的内容,但是在网上看了一些博客,大概都讲的差不多,随便找几篇博客来看(https://developer.51cto.com/art/201906/597961.htm),你就会对这个协议有一个大概的了解(有些地方或许读者和我一样可能也看的不是很明白,但是这对编程阻碍不大),所以我也不打算写这个了(理由是,自己也比较菜,只要大概了解一下这部分内容就行,在日后学习或者工作当中遇到什么不理解的地方再去深入学,比较有针对性;所以侧重点还是在编程上,最终实现理论转到实践当中去,才是王道)。不过经典的TCP三次握手和四次挥手告别,这个基本你必须要明白,这里简单介绍一下,那么就开始今天的内容了。

    01

    深入理解计算机系统(第三版)/ CSAPP 杂谈,第11章:网络编程

    int socket(int domain, int type, int protocol) // 创建套接字描述符,成功返回非负数描述符,失败为-1 int connect(int clientfd, const struct sockaddr *addr, socklen_t addrlen) // 连接服务器,成功为 0,失败为 -1 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) // 连接客户端,成功为 0,失败为 -1 int listen(int sockfd, int backlog) // 等待客户端连接。此函数将主动套接字转化为监听套接字,成功为 0,失败为 -1 int accept(int listenfd, struct sockaddr *addr, socklen_t addrlen) // 等待来自客户端的连接,成功返回非负数连接描述符,失败为-1 int getaddrinfo(const char* host, const char* service, const struct addrinfo* hints, struct addrinfo** result) // 用于主机名,主机地址,服务名,端口号的字符串表示转换成 addrinfo // addrinfo 是一个列表,客户端调用 getaddrinfo 后需要遍历 result 这个列表,直到某个元素可以执行 socket 和 connect 成功 // host 可以是域名也可以是 ip 地址 // service 可以是服务名(http)或端口号 // hints 用于设置一些参数以便对返回的 result 列表做更好的控制 int getnameinfo(const struct sockaddr *sa, socklen_t salen, char* host, size_t hostlen, char *service, size_t servlen, int flags) // 用于 sockaddr 转换成 主机名,主机地址,服务名,端口号的字符串表示 // 简化版(非 Linux 内核内置) int open_clientfd(char *hostname, char *port) // 客户端连接服务器 int open_listenfd(char* port) // 服务器监听端口

    03

    Socket 编程原理

    socket编程即计算机网络编程,目的是使两台主机能够进行远程连接,既然要使两者产生联系,那么就要有至少一个信息发送端和一个信息接收端,因此形成了现在绝大多数 socket 编程都会用到的 C/S 架构(Client[客户端]/Server[服务端]),最典型的应用就是 web服务器/客户端。 在 Unix/Linux 中执行任何形式的 I/O 操作(比如网络连接)时,都是在读取或写入一个文件描述符,而在 Windows 中则被称为文件句柄,其本质都是一个东西,但是 Windows系统会把 socket 当成一个网络连接,需要调用专门设计的数据传输函数。 socket (套接字)是一种抽象层,程序通过它来收发数据,就像打开一个句柄将数据写在存储器上一样,使用 socket 能将程序放在网络中,并与同一网络下其他计算机进行通信。 现在问题又来了,主机内部应用间进行通信,不同应用可用进程号作为唯一标识,那么在网络间通信用什么作为唯一标识呢?其实 TCP/IP 协议簇已经解决了问题,在网络层 IP 地址可以用作网络中主机的唯一标识,传输层的”协议+端口”可用作主机应用的唯一标识,因此利用三元组(IP地址、协议、端口)就可以标识网络应用了,网络应用间可以用三元组作为标志和其他应用进行交互,socket 通信大致如下:

    06
    领券