思维导图
1.跨主机的拷贝
ser.c
#include<header.h>
int main(int argc, const char *argv[])
{
//定义一个文件描述符,以只写的形式打开目标文件
int wfd=open("./text1.txt1",O_WRONLY|O_CREAT|O_TRUNC,0664);
if(wfd==-1)
{
perror("open error");
return -1;
}
//1.创建套接字文件
int sfd=socket(AF_INET,SOCK_STREAM,0);
if(sfd==-1)
{
perror("socket error");
return -1;
}
printf("sfd=%d\n",sfd);
//2.绑定IP地址和端口号
//2.1填充要绑定的地址信息结构体
struct sockaddr_in sin;
sin.sin_family=AF_INET;//通讯域
sin.sin_port=htons(8888);//端口号
sin.sin_addr.s_addr=inet_addr("192.168.124.51");//IP地址
//2.2绑定
if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1)
{
perror("bind error");
return -1;
}
puts("bind success");
//3.设置监听状态
if(listen(sfd,128)==-1)
{
perror("listen error");
return -1;
}
puts("listen success");
//4.阻塞接收客户端连接请求
//4.1定义容器接收客户端的地址信息
struct sockaddr_in cin;//用于接收地址信息
socklen_t socklen=sizeof(cin);//用于接收地址信息的大小
//4.2接收客户端的连接请求
int newfd=accept(sfd,(struct sockaddr*)&cin,&socklen);
if(newfd==-1)
{
perror("accept error");
return -1;
}
printf("[%s:%d:%d]发来连接请求……\n",inet_ntoa(cin.sin_addr),\
ntohs(cin.sin_port),newfd);
puts("accept success");//连接成功
//5.收发数据
//5.1定义容器接收从客户端发来的信息
char wbuf[128]="";
while(1)
{
int res=recv(newfd,wbuf,sizeof(wbuf),0);
if(res==0)
break;
//5.2将发来的信息拷贝进目标文件
write(wfd,wbuf,sizeof(wbuf));
}
puts("拷贝成功");
//6.关闭套接字
close(sfd);
close(wfd);//关闭文件
return 0;
}
cli.c
#include<header.h>
int main(int argc, const char *argv[])
{
//定义一个文件指针,以只读的形式打开源文件
FILE *rfq=fopen("./text.txt","r");
if(rfq==NULL)
{
perror("fopen error");
return -1;
}
//1.创建套接字文件
int cfd=socket(AF_INET,SOCK_STREAM,0);
if(cfd==-1)
{
perror("socket error");
return -1;
}
printf("cfd=%d\n",cfd);
//2.绑定IP地址和端口号
//2.1填充要绑定的地址信息结构体
struct sockaddr_in cin;
cin.sin_family=AF_INET;//通讯域
cin.sin_port=htons(6666);//端口号
cin.sin_addr.s_addr=inet_addr("192.168.124.51");//IP地址
//2.2绑定
if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1)
{
perror("bind error");
return -1;
}
puts("bind success");
//3.连接服务器
//3.1填充服务器地址信息结构体
struct sockaddr_in sin;
sin.sin_family=AF_INET;//通讯域
sin.sin_port=htons(8888);//端口号
sin.sin_addr.s_addr=inet_addr("192.168.124.51");//IP地址
//3.2连接
if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1)
{
perror("connect error");
return -1;
}
puts("connect success");
//4.收发数据
//4.1定义容器接收从源文件中读取的信息
char rbuf[128]="";
while(1)
{
char *res=fgets(rbuf,sizeof(rbuf),rfq);
if(res==NULL)
break;
printf("%s",rbuf);
//4.2发送给服务器
send(cfd,rbuf,sizeof(rbuf),0);
}
//5.关闭套接字
close(cfd);
fclose(rfq);//关闭文件
return 0;
}
模拟面试
1.OSI七层网络体系结构?
物数网传会表应
物理层、数据链接层、网络层、 运输层/传输层、会话层、表示层、应用层
2.分层的好处
-
1、各层之间独立,每一层不需要知道下一层如何实现,而仅仅只需要知道该层通过层间的接口所提供的服务
-
2、稳定,灵活性好,当任何一层发生变化时,只需要层间接口关系保持不变,而这层以上或以下层不受影响
-
3、易于实现和维护(知道是什么功能,就到指定层去查找)
-
4、促进标准化工作:每一层的功能及其所提供的服务都有了精确的说明。
-
5、结构上不可分割开:各层都可以采用最合适的技术来实现。
3.TCP/IP四层网络体系结构及重要协议
应用层:HTTP、TFTP、DNS
传输层:TCP、UDP
网络层/网际层:IP
链路层:ARP、RARP
4.路由器工作在哪一层,交换机工作在哪一层
网际层、链路层
5.TCP和UDP的区别
-
TCP ---> 稳定
-
1.提供面向连接的,可靠的数据传输服务,连接时会有三次握手,断开时会有四次挥手,UDP没有
-
2.传输过程中,数据无误、数据无丢失、数据无失序、数据无重复
-
TCP会给每个数据包编上编号,该编号称之为序列号
-
每个序列号都需要应答包应答,如果没有应答,则会将上面的包重复发送直到正确为止
-
-
3.数据传输效率低,耗费资源多
-
4.数据收发是不同步的
-
为了提高效率,TCP会将多个较小,并且发送间隔短的数据包,沾成一个包发送,该现象称为沾包现象
-
该沾包算法称之为Nagle算法
-
-
5.TCP的使用场景:对传输质量比较高的以及传输大量数据的通信,在需要可靠通信的传输场合,一般使用TCP协议
-
-
UDP ---> 快速
-
1.面向无连接的,不保证数据可靠的,尽最大努力传输的协议
-
2.数据传输过程中,可能出现数据丢失、重复、失序现象
-
3.数据传输效率高,实时性高
-
4.限制每次传输的数据大小,多出部分直接忽略删除
-
5.收发是同步的,不会沾包
-
6.适用场景:发送小尺寸的,在接收到数据给出应答比较困难的情况下
-
6.TCP服务的实现