您的位置:首页 > 理论基础 > 计算机网络

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

2017-06-27 09:29 351 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息