番禺做网站公司,wordpress文字替换,经营者采用过哪几种网络营销方式,做数据的网站有哪些内容文章目录 TCP 短服务编写流程进程组和会话和守护进程 TCP 短服务编写流程 TCP服务器是面向连接的#xff0c;客户端在发送数据之前需要先与服务器建立连接。 因此#xff0c;TCP服务器需要能够监听客户端的连接请求。为了实现这一功能#xff0c;需要将TCP服务器创建的套接字… 文章目录 TCP 短服务编写流程进程组和会话和守护进程 TCP 短服务编写流程 TCP服务器是面向连接的客户端在发送数据之前需要先与服务器建立连接。 因此TCP服务器需要能够监听客户端的连接请求。为了实现这一功能需要将TCP服务器创建的套接字设置为监听状态以便等待和处理客户端的连接请求。服务器在完成监听工作后才算初始化完成。 客户端在创建套接字后使用 connect 函数向服务器发起连接请求而服务器通过 accept 函数来获取客户端发来的连接请求。连接成功后服务器和客户端才开始通信。
监听int listen(int sockfd, int backlog); sockfd 为监听文件描述符。backlog 参数限制了在服务器还没有来得及接受的连接请求可以在队列中排队等待的最大数量。当达到这个数量时超出的连接请求将被丢弃。函数调用成功返回0失败返回 -1并设置错误码。
发起连接int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen); 客户端发起连接请求需要知道服务器的信息因此 sockaddr 存放的服务器 IP 和 Port 信息。函数调用成功返回0失败返回 -1并设置错误码。
接收连接int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); 服务器接收请求需要记录客户端的信息以便数据发回因此 sockaddr 存放的服务器 IP 和 Port 信息。函数调用失败返回 -1并设置错误码。调用成功返回一个新的套接字描述符这个返回的描述符和前面传入的 sockfd 不同传入的 sockfd 是专门用来获取连接可以称之为监听描述符。而返回的文件描述符是为给服务器与每个客户端之间提供一条独立的、专用的通信信道确保数据传输的隔离性和完整性。这样即使服务器同时处理多个客户端每个连接也能稳定地进行数据交换互不干扰。 由上面我们可以推出TCP 服务器一定不能是单进程的因为它要同时服务多个客户端不然一个客户端连接之后其它的连接只能阻塞住等待第一个连接结束。而如果是多进程的服务器客户端连接增多系统资源消耗会非常大。对此我们推荐使用多线程或者线程池来提供服务如果是服务器给客户端提供的是长服务那么多线程和线程池区别不大。而现在我们写的服务器提供的是短服务使用线程池就能避免线程多次的创建、销毁开销提高效率。
进程组和会话和守护进程 一个理想的服务器不应该放在前台还可以让我们使用 Ctrl C 或者发送其它信号终止对此我们应该忽略一些信号如 SIG_PIPE避免因为客户端关闭服务器写回客户端失败而产生的进程终止对具体的信号要进行具体的分析。对此我们应该将服务器放到后台同时还得保证它不受终端登录或者注销的影响对此我们要将它守护进程化。
进程组和会话 在现实生活中我们经常需要团队合作来完成一项任务。通常这个团队会有一个领导者我们称之为组长。即使团队里只有一个人那个人也会承担组长的角色。在计算机的网络编程中任务是由一个进程组完成的组长的PID就是这个进程组PGID的组ID。我们平常编程中进程组里面只有一个进程所以我们感受不到。 一个或者多个进程组构成一个会话 SID这个会话退出以后它里面的所有进程组都会退出。如果我们让一个进程自己构成一个进程组自己构成一个新会话 它的 PID和PGID和SID 相同且不会再受到原来这个会话的登录注销影响。这样的进程我们称之为守护进程。 我们可以使用 pid_t setsid(void);函数使得调用进程成为一个新的会话领导者并且不会受到终端的控制。同时需注意规定进程组组长不能调用 setsid() 函数来创建一个新的会话对此调用前我们可以 fork() 一下然后关闭父进程让子进程成为守护进程即可。 守护进程一般以d结尾由于守护进程不会与任何终端交互我们将它的标准输入、标准输出和标准错误都重定向到 /dev/null。它是一个特殊的设备文件它会丢弃所有写入其中的数据读取它会立即返回文件结束EOF。通过重定向这些文件描述符来确保守护进程不会意外地接收或发送任何用户输入或输出。
Linux自带生成守护进程的接口int daemon(int nochdir, int noclose); 参数 nochdir为0则将当前工作目录切换到根目录下否则保持不变。参数 noclose为0则关闭标准输入、标准输出和标准错误否则保持不变。函数调用成功返回0失败返回-1并设置错误码。