1.16 第二章+第三章 TCP和UDP基础通信模型day2+TCP并发服务器day1

思维导图

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服务的实现

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值