• TCP客户端服务器编程模型


    1.客户端调用序列

    客户端编程序列如下:

    1. 调用socket函数创建套接字
    2. 调用connect连接服务器端
    3. 调用I/O函数(read/write)与服务器端通讯
    4. 调用close关闭套接字

    2.服务器端调用序列

    服务端的编程序列如下:

    1. 调用socket函数创建套接字
    2. 调用bind绑定本地地址和端口
    3. 调用listen启动监听
    4. 调用accept从已连接队列中提取客户端连接
    5. 调用I/O函数(read/write)与客户端通讯
    6. 调用close函数关闭套接字

    3.常用函数

    3.1.套接字与地址绑定函数

    (1)绑定地址

    1 #include <sys/socket.h>
    2 int bind(int sockfd, const struct sockaddr *addr, socklen_t len);

    返回:成功返回0,出错返回-1

    特殊bind地址介绍

    一个主机可以有多个网络接口和多个IP地址,如果我们只关心某个地址的连接请求,我们可以指定一个具体的本地IP地址,如果要响应所有接口上的连接请求就要使用一个特殊的地址INADDR_ANY

    #define INADDR_ANY (uint32_t)0x00000000

    监听所有服务器上IP得到的连接请求:

    1 struct sockaddr_in servaddr;
    2 memset(&servaddr, 0, sizeof(servaddr));
    3 servaddr.sin_addr.s_addr = INADDR_ANY;

    3.2.查找绑定到套接字的地址

    1 #include <sys/socket.h>
    2 int getsockname(int sockfd, struct sockaddr *restrict_addr, socklen_t *restrict_alenp);

    返回:成功返回0,出错返回-1

    3.3.获取对方地址

    1 int getpeername(int sockfd, struct sockaddr *restrict_addr, socklen_t *restrict_alenp);

    返回:成功返回0,出错返回-1

    3.4.服务器端建立连接

    1 #include <sys/socket.h>
    2 int listen(int sockfd, int backlog);

    返回:成功返回0,出错返回-1。

    backlog指定进行客户端连接排队的队列长度。

    1 int accept(int sockfd, struct sockaddr *restrict_addr, socklen_t *restrict_len);

    返回:成功返回一个新的sockfd(客户端的)。

    3.5.客户端请求连接

    1 #include <sys/socket.h>
    2 int connect(int sockfd, const struct sockaddr *addr, socklen_t len);

    返回:成功返回0,出错返回-1

    3.6.IO操作函数

    read和write函数默认都是阻塞性的读写函数。此时需要考虑服务器的并发处理。

    4.服务器端并发性处理

    4.1.多进程模型

    弊端:进程占用系统资源,当子进程过多将占用过多的系统资源,难以处理大并发的场景。

    4.2.多线程模型

    以分离状态去启动子线程,子线程运行完后自动释放空间。

  • 相关阅读:
    Linux下安装python
    oracle 12c使用问题总结
    oracle下载地址
    Informatica PowerCenter下载地址
    主流ETL工具
    【phonegap】下载文件
    eclipse显示包的层次关系
    UltraISO 9.6.5.3237
    Windows操作系统设置代理
    wireshark常用的过滤命令
  • 原文地址:https://www.cnblogs.com/mrlayfolk/p/11968446.html
Copyright © 2020-2023  润新知