主要学习 这种类型的套接字
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+`,然后就可以输入东西了。