socket2套接字笔记

主要学习 在这里插入图片描述这种类型的套接字
sockaddr是给用户层提供的一种数据结构,本质上是操作系统提供的接口(数据类型),它本质上是一种通用结构。套接字常见的一共分为三类套接字。
套接字通信本质上属于进程间通信的一种
ip+端口号=socket
端口号用来标定特定一台机器上唯一的网络进程
网络字节序为大端


在这里插入图片描述
创建套接字,第一个参数表示IPV4(协议族),第二个是udp传输(套接字种类),第三个参数默认为0
返回值是一个文件描述符,创建套接字就和打开一个file*一样的,也就是说,操作系统里一个进程可以打开多个套接字,然后管理他们的数据结构为struct_sock{}
所以进程和套接字一定是关联起来的,通过文件描述符表关联


在这里插入图片描述

这个操作是创建了套接字,在系统资源上创建了网络通信所需要的资源,接下来我们需要把这些资源和网络通信相关的数据关联起来!!!

在这里插入图片描述
创建了sockaddr_in这个对象,然后把IPV4,端口号,ip地址输入给它,然后再把它和sock绑定。
所谓的绑定是在干什么?
文件结构体力包含了大量的函数指针。
先记两个结论,这个有点难理解
1.填充进当前机器的IP地址和端口号
2.不同套接字的操作方法不一样,要初始化底层的函数指针,指向不同的调用方法
现在只需要记住:这个绑定是肯定要做的,做了之后,服务器就明确的把本地端口号和本地IP和当前我的进程关联起来了。


udp是面向数据块的,读取出来的数据是一块一块的在这里插入图片描述
所以定义一块msg在这里插入图片描述


客户端

客户端也要创建套接字
在这里插入图片描述

在这里插入图片描述
客户端不需要绑定,不是说客户端不需要IP和端口

服务器的IP和port不能改变,基本是永远不会变:为什么? 服务器面对成千上万的人,服务器一改,客户就找不到服务器了。
客户端不需要Bind:为什么? 客户端机器上有很多APP,(一个端口号只能和一个进程相关)1.客户端在进行bind的时候,很容易冲突,导致客户端无法启动 2.客户端需要唯一性,但是不需要明确规定哪个端口数字关联哪个进程,不需要强关联绑定
但是需要ip和port:client udp 和recv,系统会自动进行IP和端口号的绑定!

端口为是无符号16位比特,系统最多有65535个端口号


客户端给别人发消息,就得知道对方的IP和端口号
在这里插入图片描述
这个peer 就是对方的ip地址和端口号, 因为这个代码用了回环地址,然后是直接从server.hpp cat过来的 所以不用改


我想把自己主机的IP和端口号主管地传入

在这里插入图片描述

usage自定义手册 然后参数传3是因为,除了ip和port ,程序名也占用一个参数位置的
在这里插入图片描述
在这里插入图片描述
把命令行参数的1和2传入
在这里插入图片描述


接下来我们以同样的方式修改下客户端的
然后客户端里后面命令行跟的IP和端口号是填服务器的 不是填自己的!!上面的笔记说过了
客户端自己的bind自己生成,不用你关心,你只需要指明目的地!客户端需要连接别人,客户端主动连服务器

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
本地环回就是自己从上到下,再从下到上,自己跑一遍,把协议栈自己过一遍
要在远端测试,必须知道公网IP在这里插入图片描述
这个就是公网IP 和自己Ifconfig看到的地址是不一样的,自己ifconfig出来的是自己本地的局域网IP

做实验的时候,直接绑定云服务器的公网IP 大概率回bind失败
在这里插入图片描述
在指定IP的时候直接输入0的含义:绑定0和绑定公网IP是一样的


在实际工程当中,其实是很少自己指定ip的
所以我们把自己指定ip的代码去掉
在这里插入图片描述


把IP换成INADDR_ANY
在这里插入图片描述

如果你绑定的是一个特定的IP,那么,你以后只能读取这个IP上的上行的下行,但是IP的本质是标定主机的,如果我绑定的是ANY,那我收上来的所有IP报文都交给你,如果我绑定是具体的某个IP,只有在这个IP的报文我才会给你

所以上面代码的argv参数可以只传两个,可以把Ip省了


在这里插入图片描述
收取的时候,客户端的ip和端口号,保存在了end_point 这个sockaddr_in结构体当中。


在这里插入图片描述
将4字节IP转化为点分十进制

在这里插入图片描述
把字符串风格的IP地址转换成网络序列


在这里插入图片描述
这个INADD_ANY 这里sin_addr.s_addr也要配置起来
这个挺好玩的


在这里插入图片描述
上图是无符号4字节的网络地址如何转成点分十进制

在这里插入图片描述
连接以后打错删除需要按住CTRL+退格

在这里插入图片描述

在这里插入图片描述
出了点小bug 字典程序在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
这个针对exit(1);

在这里插入图片描述

在这里插入图片描述
讲道理,这个INADDR_ANY也要用主机序列转网络序列转一下的,但是他本身是全0,所以对结果没有影响

![在这里插入图片描述](https://img-blog.csdnimg.cn/fcca24cf0ea94777b118221dbc488a4f.png

在这里插入图片描述

别问,我也懒得记,反正写服务器这两个就包含进来吧


在这里插入图片描述
将该套接字设置为监听状态,backlog为底层的队列长度,海底捞生意好顾客排队

在这里插入图片描述
返回的也是文件描述符sock ,农家乐,在门口拉客的员工相当于sockfd图中选中的,客人指的是TCP链接,返回值用来与链接沟通,提供服务,返回值提供通信

打开一般的文件习惯性叫做打开一个流,一个文件默认会打开三个流…
tcp socket也是流的概念,可以用read 和 write写
在这里插入图片描述
udp叫recvfrom
tcp叫recv

在这里插入图片描述
udp叫sendto
tco叫send

在这里插入图片描述
绑定IP全0表示任意IP都可以

在这里插入图片描述
启动服务器,然后创建用一个进程去telnet它
为什么会看到两条链接?
因为在一台机器上,如果是两台机器,就只有一条链接了,讲道理应该现在只看到第一条链接,因为上面的LOCAL 和FOREIGN
不解释了。在这里插入图片描述
telnet的用法,链接之后要求舒服CTRL+`,然后就可以输入东西了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值