预备知识:
1.端口号:
主机与主机之间的通信:
-
网络协议中的下三层,主要解决的是数据可靠的运送到远端机器
-
用户使用应用层软件,完成数据的发送和接收
网络间通信的本质:
进程间的通信
端口号:
-
端口号是一个2字节16位的整数
-
端口号是用来表示一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理
-
IP地址 + 端口号能够表示网络上的某一台主机的某一个进程
-
一个端口号只能被一个进程占用
IP + port(端口号):套接字(socket)
2.端口号 vs pid
pid已经能够标识一台主机上进程的唯一性,为什么还要搞一个端口号?
-
不是所有的进程都要网络通信,但是所有进程都要有pid
-
系统和网络的功能解耦
3.一个进程可以绑定多个端口吗?可以的
一个端口号可以被多个进程绑定吗?不可以
对应 ip + port = 进程的例子:
传输层的协议的认识:
TCP:(传输控制协议)
-
传输层协议
-
有链接
-
可靠传输
-
面向字节流
UDP:(用户数据包协议)
-
传输层协议
-
无连接
-
不可靠传输
-
面向数据报
网络字节序:
内存中的地址有大端和小端之分,那么如何定义网络数据流的地址呢?
规定如下:
-
发送主机通常将发送缓冲区的数据按内存地址从低到高的顺序发出
-
接受主机把从网络上接到的字节依次保存在缓冲区中,也是按内存从低地址到高地址
-
先发出的数据是低地址,后发出的数据是高地址
-
TCP\IP协议规定,网络数据流应采用大端字节序,即低地址高字节
socket编程接口:
套接字编程的种类:
1.域间(同一个机器内)
2.原始(编写网络工具)
3.网络(主要讲,用户间的网络通信)
前16位便是的是通信的类型。
对应判断类型的方式:
if(address->type == AF_INET) //网络
{
}
if(address->type == AF_UNIX) //原始
{
}
UDP服务器的代码实现:
认识接口:
创建套接字的接口。
绑定接口:
将struct sockaddr_和对应的套接字绑定。
接受:
对应从服务器或者用户中接入信息。
发送:
对应发送的接口。
接下来代码如下:
服务器代码:
其中注意的两个细节:
1.关于port:
[0,1023]:系统内定的端口:http:80,https:443
[1024,65535]:自己使用
如果是[0,1023]中的端口:
对应显示端口以定义,当然在root下面还是可以绑定成功的。
如果是[1024,65535]中的端口:
2.关于ip:
云服务器禁止直接绑定公网ip
只能通过默认路由地址进行绑定。
对应代码执行的结果:
如果不是默认路由(0.0.0.0):
如果是默认路由:
对应 netstat -nlup查看对应链接成功的服务器接口:
对应加上用户,让用户与服务器之间进行通信:
client要bind吗?
-
要,只不过不需要用户显示的绑定,一般有系统自由随机选择。
-
一个端口号只能被一个进程绑定,对server是如此们对于cilent也是如此
-
其实client的port是多少,其实不重要,只要保证主机上的唯一性就可以了
-
系统给用户的绑定的时间:首次发送的数据
对应打代码:
对应的结果:
对应用户法这么网络就会接受什么。
udp的三个应用场景:
1.指令系统
popen:
可以通过文件将读入的字符串直接转换为命令行命令:
对应的代码:
main.cc:
其中用绿色框柱的是修改的:
udpserver.hpp:
127.0.0.1:
本地环回地址,用本地第之间的信息传输。
2.2.windows和linux网络互聊:
需要在vs里面写对应的用户代码:
3.用户记录功能
客户端多线程化:
同时增加记录用户功能和用户广播功能:
UdpServer.hpp:
对应的inet_ntoa是将整形的ip地址转换为字符串。
Udpserverclient.cc:
对应使用了多线程将线程的属性封装成了结构体。
对应的结果:
对应将客户端向服务器的发送只会在服务器上出现了,因为进行了重定向:
对应的/dev/pts/2对应的就是终端。
对应的记录用户功能和用户广播:
关于inet_ntoa:
对应存在问题:
第二次调用会覆盖掉上次的结果。
解决方法:
inet_ntop.
tcp的通用服务器:
代码:
守护进程:
一个会话只能有一个前台进程在运行,键盘信号只能发给前台进程。
什么叫前台进程?
拥有键盘文件的进程就是前台进程
对应查找正在运行的进程指令:
jobs
对应将进程转变为前台进程:
fg
对应将进程转变为后台进程:
bg
进程组的概念:
对应多个任务,在同一个会话内启动的sid是一样的。
进程和任务的关系:
进程用来执行任务的。
对应创建好的进程收到了用户的登录和退出的影响,
会是所用的进程变为孤儿进程被系统回收。
守护进程的本质也是孤儿进程。
对应存在守护进程的接口:
tcp的三次握手和四次挥手