学习笔记11

一、概述:

这一章主要介绍了TCP/IP协议,首先是讲述了TCP/IP协议以及其应用,包括TCP/IP栈、DNS、主机名、路由器等等,在计算机操作系统中,TCP和UDP会遇到同时为多个应用程序提供并发服务的问题,多个TCP连接或者多个应用程序需要借助相同的TCP协议端口传输数据,通过借助TCP、UDP套接字的规则来演示网络编程。之后是讲述了web编程,展示了如何借助linux的系统来支持web,cgi,php编程并且还进行了演示,讲解了借助cgi和php创建动态web的页面。

 

二:主要内容:

(一)TCP/IP基础知识

1.ISO/OSI基础模型

 

各层具体意义:

物理层:定义了所有电子物理设备的使用规则,给向上层的传输提供了物理介质,例如现实中使用的网卡等等即属于此层。

数据链路层:对来自物理层的数据流信息封装成帧,实现无差错的数据传输,进行可靠的数据传输服务,实际中使用的例如交换器属于此层。

网络层:将各个子网的数据进行选择分配重组,以数据包的形式传输。现实中的路由器就属于此层。

传输层: 检测上一层中路由器丢失的包数据,再产生一个重传请求,并将无序的包排序。

会话层:会话的建立、终止以及管理均由该层控制。

应用层:和应用程序进行沟通,再进行修改完善达到用户要求。

 

四层模型:

 

 四层模型实例:

 

 

2.客户-服务器模型

大部分网络应用程序在编写时都假设一端是客户,另一端是服务器,其目的就是为了让服务器为客户提供一些特定的服务。

可将这种服务分为两种类型,重复型和并发型

重复型服务器可通过以下步骤进行交互:

①等待一个客户请求的到来

②处理客户请求

③发送响应给发送请求的客户

④返回1

注意:重复型服务器主要问题都在②,在此状态下,它不能给其他服务器提供服务

并发型服务器:

①等待一个客户请求的到来

②启动一个心得服务器来处理这个客户的请求,在此期间可能生成一个新的进程

③返回1

一般来说,TCP服务器是并发的,而UDP服务器是重复的。

 

(二)网络编程:

对于Linux而言,socket操作与文件操作没有区别,socket被认为是文件的一种,因此在网络数据传输的过程中可以使用文件I/O的相关函数.

 

①打开文件

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

int open(const char *path,int flag);

成功时返回文件描述符,失败返回-1

②关闭文件

#include <unistd.h>

int close(int fd);

成功时返回0,失败返回-1

③将数据写入文件

write函数用于向文件输出数据,linux系统中不区分文件与套接字

#include <unistd.h>

ssize_t wirte(int fd,const void *buf,size_t nbytes);

成功时返回写入的字节数,失败返回-1

④读取文件中的数据

#include <unistd.h> 

ssize_t read(int fd,void *buf,size_t nbytes);

成功时返回接收的字节数(但遇到文件结尾则返回0),失败时返回-1

 

套接字的域(又称协议族)

域指定套接字通信中使用的网络介质.最常见的套接字域是AF_INET,它指的是Internet网络.其底层的协议–网际协议(IP)只有一个地址族,它使用IP地址来指定网络中的计算机

 

 

四:代码实践

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
int sockfd;
int len;
struct sockaddr_un address;
int result;
char ch='A';

sockfd=socket(AF_UNIX,SOCK_STREAM,0);

address.sun_family=AF_UNIX;
strcpy(address.sun_path,"server_socket");
len=sizeof(address);

result=connect(sockfd,(struct sockaddr *)&address,len);
if(result == -1)
{
perror("oops:client1");
exit(1);
}

//现在就可以通过sockfd进行读写操作了
write(sockfd,&ch,1);
read(sockfd,&ch,1);
printf("char from server = %c\n",ch);
close(sockfd);
close(sockfd);
exit(0);
}

 

posted @ 2021-11-22 21:44  zzy188  阅读(44)  评论(0编辑  收藏  举报