一、具体操作
1.登陆虚拟机(ubutu)
账号 root 密码root
2.打开多个窗口
快捷键 ctrl+alt+t
3.打开服务器
./server
4.设置本地IP地址
ifconfig eth0 192.168.1.1
查看IP地址 ifcofig
将网卡禁用
ifconfig eth0 down
将网卡启用
ifconfig eth0 up
5.打开客户机
./client 192.168.1.1
6.打开数据库文件
cd ./output
打开文件
sqlite3 chatroom.db
显示文件内容
select * from mytable;
退出sqlite3,回来shell界面
.quit
7.打开编辑文件
vim main.c
往前追踪 ctrl+]
往回退 ctrl+t
二、网络进程之间的通信
TCP/IP协议的应用程序通常采用应用编程接口 套接字socket
1.网络三元组
ip地址,协议,端口
(网络层的“ip地址”可以唯一标识网络中的主机,
而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程))
2.socket概念
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口
(建立了socket,就像与网络开了一个通道,各网络的主机可以通过通道传输数据)。
3.套接字描述符
3.1 其实就是一个整数,我们最熟悉的句柄是0、1、2三个,0是标准输入,1是标准输出,
2是标准错误输出。0、1、2是整数表示的,对应的FILE *结构的表示就是stdin、stdout、stderr
3.2 只要两个网络进程IP地址,端口号相同,使他们连接成功,便可以根据套接字描述符
来读写数据。
3.3 操作系统就创建一个文件描述符提供给应用程序访问文件。从应用程序的角度看,
文件描述符是一个整数,应用程序可以用它来读写文件。
4.文件描述符和文件指针的区别:
文件描述符:在linux系统中打开文件就会获得文件描述符,它是个很小的正整数。
每个进程在PCB(Process Control Block)中保存着一份文件描述符表,
文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。
文件指针:C语言中使用文件指针做为I/O的句柄。文件指针指向进程用户区中的一个被
称为FILE结构的数据结构。FILE结构包括一个缓冲区和一个文件描述符。
而文件描述符是文件描述符表的一个索引,因此从某种意义上说文件指针
就是句柄的句柄(在Windows系统上,文件描述符被称作文件句柄)。
5.socket建立链接的过程
服务器:
服务器端先初始化Socket
然后与端口绑定(bind)
对端口进行监听(listen)
调用accept阻塞,等待客户端连接
write()
read()
close()
客户机:
客户端初始化一个Socket
连接服务器(connect)
write()
read()
close()
通常服务器在启动的时候都会绑定一个众所周知的地址(如ip地址+端口号),
用于提供服务,客户就可以通过它来接连服务器;而客户端就不用指定,有系
统自动分配一个端口号和自身的ip地址组合。这就是为什么通常服务器端在listen
之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。
6.字节序
主机字节序:
我们平常说的大端和小端模式:不同的CPU有不同的字节序类型,
这些字节序是指整数在内存中保存的顺序,这个叫做主机序。引用标准的Big-Endian
和Little-Endian的定义如下:
a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存
的高地址端。
b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
网络字节序:
4个字节的32 bit值以下面的次序传输:首先是0~7bit,其次8~15bit,
然后16~23bit,最后是24~31bit。这种传输次序称作大端字节序。由于TCP/IP首部中
所有的二进制整数在网络中传输时都要求以这种次序,因此它又称作网络字节序。
7.服务器的两种套接字
监听套接字: 监听套接字正如accept的参数sockfd,它是监听套接字,在调用listen
函数之后,是服务器开始调用socket()函数生成的,称为监听socket描
述字(监听套接字)
连接套接字:一个套接字会从主动连接的套接字变身为一个监听套接字;而accept函
数返回的是已连接socket描述字(一个连接套接字),它代表着一个网络
已经存在的点点连接。
7.1 一个服务器通常通常仅仅只创建一个监听socket描述字,它在该服务器的生命周期内
一直存在。内核为每个由服务器进程接受的客户连接创建了一个已连接socket描述字,
当服务器完成了对某个客户的服务,相应的已连接socket描述字就被关闭。
7.2 自然要问的是:为什么要有两种套接字?
原因很简单,如果使用一个描述字的话,那么它的功能太多,使得使用很不直观,
同时在内核确实产生了一个这样的新的描述字。
连接套接字socketfd_new 并没有占用新的端口与客户端通信,依然使用的是与监
听套接字socketfd一样的端口号
1.登陆虚拟机(ubutu)
账号 root 密码root
2.打开多个窗口
快捷键 ctrl+alt+t
3.打开服务器
./server
4.设置本地IP地址
ifconfig eth0 192.168.1.1
查看IP地址 ifcofig
将网卡禁用
ifconfig eth0 down
将网卡启用
ifconfig eth0 up
5.打开客户机
./client 192.168.1.1
6.打开数据库文件
cd ./output
打开文件
sqlite3 chatroom.db
显示文件内容
select * from mytable;
退出sqlite3,回来shell界面
.quit
7.打开编辑文件
vim main.c
往前追踪 ctrl+]
往回退 ctrl+t
二、网络进程之间的通信
TCP/IP协议的应用程序通常采用应用编程接口 套接字socket
1.网络三元组
ip地址,协议,端口
(网络层的“ip地址”可以唯一标识网络中的主机,
而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程))
2.socket概念
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口
(建立了socket,就像与网络开了一个通道,各网络的主机可以通过通道传输数据)。
3.套接字描述符
3.1 其实就是一个整数,我们最熟悉的句柄是0、1、2三个,0是标准输入,1是标准输出,
2是标准错误输出。0、1、2是整数表示的,对应的FILE *结构的表示就是stdin、stdout、stderr
3.2 只要两个网络进程IP地址,端口号相同,使他们连接成功,便可以根据套接字描述符
来读写数据。
3.3 操作系统就创建一个文件描述符提供给应用程序访问文件。从应用程序的角度看,
文件描述符是一个整数,应用程序可以用它来读写文件。
4.文件描述符和文件指针的区别:
文件描述符:在linux系统中打开文件就会获得文件描述符,它是个很小的正整数。
每个进程在PCB(Process Control Block)中保存着一份文件描述符表,
文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。
文件指针:C语言中使用文件指针做为I/O的句柄。文件指针指向进程用户区中的一个被
称为FILE结构的数据结构。FILE结构包括一个缓冲区和一个文件描述符。
而文件描述符是文件描述符表的一个索引,因此从某种意义上说文件指针
就是句柄的句柄(在Windows系统上,文件描述符被称作文件句柄)。
5.socket建立链接的过程
服务器:
服务器端先初始化Socket
然后与端口绑定(bind)
对端口进行监听(listen)
调用accept阻塞,等待客户端连接
write()
read()
close()
客户机:
客户端初始化一个Socket
连接服务器(connect)
write()
read()
close()
通常服务器在启动的时候都会绑定一个众所周知的地址(如ip地址+端口号),
用于提供服务,客户就可以通过它来接连服务器;而客户端就不用指定,有系
统自动分配一个端口号和自身的ip地址组合。这就是为什么通常服务器端在listen
之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。
6.字节序
主机字节序:
我们平常说的大端和小端模式:不同的CPU有不同的字节序类型,
这些字节序是指整数在内存中保存的顺序,这个叫做主机序。引用标准的Big-Endian
和Little-Endian的定义如下:
a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存
的高地址端。
b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
网络字节序:
4个字节的32 bit值以下面的次序传输:首先是0~7bit,其次8~15bit,
然后16~23bit,最后是24~31bit。这种传输次序称作大端字节序。由于TCP/IP首部中
所有的二进制整数在网络中传输时都要求以这种次序,因此它又称作网络字节序。
7.服务器的两种套接字
监听套接字: 监听套接字正如accept的参数sockfd,它是监听套接字,在调用listen
函数之后,是服务器开始调用socket()函数生成的,称为监听socket描
述字(监听套接字)
连接套接字:一个套接字会从主动连接的套接字变身为一个监听套接字;而accept函
数返回的是已连接socket描述字(一个连接套接字),它代表着一个网络
已经存在的点点连接。
7.1 一个服务器通常通常仅仅只创建一个监听socket描述字,它在该服务器的生命周期内
一直存在。内核为每个由服务器进程接受的客户连接创建了一个已连接socket描述字,
当服务器完成了对某个客户的服务,相应的已连接socket描述字就被关闭。
7.2 自然要问的是:为什么要有两种套接字?
原因很简单,如果使用一个描述字的话,那么它的功能太多,使得使用很不直观,
同时在内核确实产生了一个这样的新的描述字。
连接套接字socketfd_new 并没有占用新的端口与客户端通信,依然使用的是与监
听套接字socketfd一样的端口号