客户端与服务器通信项目1

1、功能需求:

1、实现客户端与服务器的基本通信
2、客户端能够读取服务器的文件列表,并在客户端进行打印
3、客户端输入对应的文件名称后,服务器能够将对应文件传输给客户端
4、服务器在传输文件过程中,客户端可以开启、暂停和终止文件传输
5、客户端能够获取服务器的配置参数,包括服务器名称和最多支持客户端连接数量
6、客户端能够修改服务器的配置参数,并保存,重启后仍生效
7、实现多线程处理机制,并行处理多客户端的访问
注:使用静态链接库和Makefile脚本编译工程

2、socket通信的过程

Socket也就是我们所说的套接字,是计算机之间进行通信的一种或一种方式。通过这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。
服务器先初始化socket()函数,然后与端口绑定bind()函数,对端口进行监听listen()函数,调用accept()函数,等待客户端连接。在这时如果有客户端初始化一个socket()函数,然后连接服务器connect()函数,如果连接成功,这时客户端与服务器的连接就建立了。客户端发送请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

3、socket相关函数介绍

3.1、socket()函数

int socket(int domain, int type, int protocol);
socket()函数用于创建一个socket描述符,以其作为参数,可以进行一些读写操作,参数定义如下:
1、domain:协议族(AF_INET(IPv4)、AF_INET6(IPv6)2、type:sockset类型,SOCK_STREAM(TCP)、SOCK_DGRAM(UDP)
3、protocol:指定协议,项目中指定为0

3.2、bind()函数

int bind(int sockfd, const struct sockaddr* addr, socklen_t addrlen);
bind()函数把一地址族中的特定地址赋给socket,参数如下:
1、sockfd:socket描述符,通过socket()创建
2、addr:指向要绑定给sockfd的协议地址
3、addrlen:对应的地址结构的大小

3.3、listen()函数

int listen(int sockfd, int backlog);
socket()函数创建的socket默认是一个主动类型的,listen()函数将socket变为被动类型的,等待客户端的连接,参数如下:
1、sockfd:socket描述符,通过socket()创建
2、backlog:socket可同时监听的最大连接个数

3.4、connect()函数

int connect(int sockfd, const struct sockaddr* addr, socklen_t addrlen);
客户端通过调用connect()函数来建立TCP服务器的连接,参数如下:
1、sockfd:socket描述符,通过socket()创建
2、addr:服务器的socket地址结构指针
3、addrlen:对应socket地址结构的长度

3.5、accept()函数

int accept(int sockfd, const struct sockaddr* addr, socklen_t addrlen);
服务器依次调用socket()、bind()、listen()后,就会监听指定的socket地址
客户端依次调用socket()、connect()后,向服务器发送了一个连接请求
服务器接收到该请求后,就会调用accept()接收请求,并建立连接,返回已连接的socket描述字
1、sockfd:socket描述符,通过socket()创建
2、addr:客户端的socket地址结构指针
3、addrlen:对应的socket地址结构的长度

注:一个服务器通常只创建一个socket描述字,它在该服务器的生命周期内一直存在。内核为每个由服务器进程接收的客户端连接创建了一个已经连接的socket描述字,当服务器完成了对某个客户端的服务,相应的已连接socket描述字被关闭。
3.6、write()/read()函数

ssize_t write(int fd, const void *buf, size_t count);
ssize_t read(int fd, const void *buf, size_t count);
说明:
write函数将buf中的数据写入socket数据流。成功时返回写的字节数,失败时返回-1,并同时设置error变量
read函数可以从fd中读取内容,成功时返回实际所读的字节数,返回0表示读到文件末尾,小于0表示出现了错误
这两个函数实际上并不是直接向网络中传输数据,而是先把数据写入缓存区,再读取
1、fd:socket描述符,通过socket()创建
2、buf:写入或读取的数据缓存区地址
3、count:写入或读取的数据字节数

3.7、close()函数

int close(int fd);
读写操作完毕后需要关闭该socket,此时不能再作为读写的描述符
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值