UNIX环境高级编程-读书笔记-网络编程(二)

来源:互联网 发布:淘宝致一科技 编辑:程序博客网 时间:2024/06/05 06:04

TCP 和UDP 网络通信的实现

1.三种网络地址类型
struct sockaddr_in ipv4的网络地址
struct sockaddr_in6 ipv6的网络地址
struct sockaddr 通用的网络地址

2.TCP 和 UDP
tcp : 传输控制协议 transport control protocol
特点:面向字节流 面向链接 可靠的 通信协议
udp: 用户数据报协议 user datagram protocol
特点:面向数据报 无链接 不可靠 通信协议

说明:tcp协议是面向字节流的,而且是实时的通信,通信的双方必须同时实时的链接,才能确保这种通信的实现,所以说他是可靠的
但是udp这种通信的协议,双方是无链接的,发送方把数据发送到网络,然后接受方从网络中接受数据,但是这种通信不是实时的,双方并没有同时的保持链接,因此,就可能造成一定的数据的丢失,所以才说是不可靠的。

3.软件系统体系结构:
1.c/s –client/server 客户/服务器结构
通过将任务合理的分配给客户端和服务器端,降低了系统的开销,可以充分利用两端硬件环境的优势。
2.b/s –browser/server 浏览器/服务器结构
是对c/s结构的一种演化,用户界面完全通过浏览器实现,一部分在前端实现,但是主要的事务都是在服务器实现,形成所谓的3-tier结构,

区别:
1.c/s主要是建立在局域网,b/s主要数建立在广域网。
2.c/s一般面向的固定的用户群,对信息的安全的控制能力强,但是b/s一般面向不可知的
用户群,对信息的安全的控制能力比较弱。
3.c/s程序不可避免的整体性的考虑,所以他的构建的重用性,显然没有b/s那么好。
4.处理的问题不同:c/s处理的用户面比较固定,安全要求高,与操作系统有关,一般都是相同的操作系统。 b/s是在广域网上的,面向的用户群不是固定的,与操作系统的关系最小。
4.TCP通信的实现。
我使用的是c/s的架构。

客户端:
1.socket —> 2.(bind)–>3.connect —->4.read/write —->5.close
解释:
1.socket: 创建网络链接和通信套接字
函数:int socket();

2.bind:绑定网络地(改变套接字里面的ip地址和端口号)
函数:int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
sockfd:套接字
addr:struct sockaddr 类型的地址 这个是自己的网络地址
addrlen: 前面地址的长度

返回值:成功 0,失败返回 -1 ,可以使用perro函数

说明:在客户端我们一般不需要对自己的地址进行绑定,因为,一般也没有别的地址会主动的和一个客户端进行链接。

3.connect :发起链接:
函数:int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
sockfd: 套接字
addr: 网络地址 这个是服务器的网络地址,
addrlen:地址的长度

返回值:成功 0 失败 -1 可以使用perror函数

说明:connect 里面的地址就是我要和谁链接就写谁的地址,所以在使用的时候,之前一定要
先对要和谁连的那个主机的地址进行设置:
包括:
sin_family 协议族
sin_port 端口号
sin_addr.s_addr ip地址

4.read/write也就是在和服务器通信是的时候从套接字里面的读写的一些操作

5.close 关闭套接字
由于套接字其实就是一个文件,所以在使用后,要对他进行关闭操作
函数:close()

服务器端
1.socket—->2.bind—->3. listen —->4.accept—>5.read/write—->6.close–>close

详解:
1.socket 创建网络链接套接字。

函数:int socket();

2.bind:绑定网络地(改变套接字里面的ip地址和端口号)
函数:int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
sockfd:套接字
addr:struct sockaddr 类型的地址 这个是自己的网络地址
addrlen: 前面地址的长度

返回值:成功 0,失败返回 -1 ,可以使用perro函数
说明:在服务器端,必须事先设定好自己的网络地址,只有这样别人才能和你链接上.
绑定之前先对自己的网络地址尽心设置,包括:
sin_family 协议族
sin_port 端口号
sin_addr.s_addr ip地址

3.listen 开启监听
函数:int listen(int sockfd, int backlog);
sockfd: 链接套接字
backlog: 允许监听的最大个数

返回值:成功 0 失败 -1 可以使用perror函数

说明:listen 函数的作用就是监听网络中是否有要和我进行链接的消息,backlog的个数,
其实就是允许链接的最大的个数。
还有一点注意的是:sockfd 是链接套接字,不是通信套接字。
他监听的只是链接套接字。
4.accept:接受链接,获取客户端的网络地址。
函数:int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

sockfd : 链接套接字
addr: 网络地址 【执行此函数以后,里面存的就是客户端的网络地址】
addrlen :网络地址的大小 【注意,这里传参的是变量的 地址】

返回值:返回值是一个套接字,我们称这个套接字 叫做通信套接字。

5.read/write
获取链接以后的一些读取操作。

6.close 关闭通信套接字

7.close 关闭链接套接字


总结:
1.c/s的架构的通信的基本的过程就是双方各自建立套接字来进行链接,链接以后,双方
通过套接字进行通信,一方向套接字里面写,一方从套接字里面读。
具体的就是:
客户端把自己的请求发送给服务器端。服务器端接受信息,进行解析,判断客户端的请求
的类型,然后处理请求,处理完成后,给客户端一个恢复。

2.需要注意一点的就是,客户端只有一个套接字,这个套接字即用来链接,也用来通信。
服务器端有两个套接字,一个由socket函数创建,用来链接 —-链接套接字
一个由accept函数创建,用来通信 —-通信套接字

3.在服务器端,在listen函数没有从网络中监听到链接信息的时候,accept函数一直处于一个阻塞等待的状态,
一旦监听到了链接信号,accept就会接受链接,创建通信套接字。

4.在客户端和服务器端,对于read/write
对于read() 接受:
如果没有发送数据,read函数处于一个阻塞的状态
如果对方关闭了套接字,就会直接返回零
对于write函数。
如果对方关闭了套接字,就会直接的返回 0

阅读全文
0 0