webrtc 百亿流媒体服务器开发(1)-网络编程基础(1)


文章目录

  • 如何开发以一个简单服务器
  • 信号
  • 什么是信号
  • 信号的处理方式
  • 都有哪些信号
  • 几个重要的信号
  • 发送信号
  • signal()
  • sigaction()
  • 后台服务
  • 代码中 fork 自己写版
  • 代码中 直接用daemon api
  • 终端内,tmux方式
  • tmux
  • 安装tmux
  • 开一个新的窗口
  • 一个窗口名下创建多个窗口
  • 查看所有的窗口
  • 删除某一个窗口
  • 进入某一个窗口


如何开发以一个简单服务器

server.h

/**
  * @author hch
  * @date 2022.7.11
  * @copyleft GPL 2.0
  */
#ifndef __SERVER_H__
#define __SERVER_H__

namespace hch{

class Server{
    public:
        Server();
        ~Server();
    public:
        void run();
};

}//hch

#endif //__SERVER_H__

server.cpp

#include <iostream>
#include <unistd.h>
#include "server.h"
namespace hch{

Server::Server(){
    std::cout<<"constructing..."<<std::endl;
}
Server::~Server(){
    std::cout<<"destructing..."<<std::endl;
}

void Server::run(){
    while(1)
    {
        std::cout<<"running..."<<std::endl;
        usleep(1000000);//sleep 1s
    }
}


}//hch

main.cpp

#include "server.h"
#include<iostream>

int main(int argc,char* argv[]){
    hch::Server* server=new hch::Server();
    if (server){
        server->run();
    }

}

生成可执行文件

g++ -std=c++11 -g -o server main.cpp server.cpp

运行

./server

信号

什么是信号

中断,就是要中断手头的事情,去干其他事

“妈妈叫你去吃饭了”

信号的处理方式

忽略,捕获,默认处理

都有哪些信号

man 手册:查看超多信息

1 常用工具

2 api

7 相关资料

查看有哪些信号

man 7 signal

python流媒体服务器 流媒体服务器开发框架_python流媒体服务器

几个重要的信号

1.SIGPIPE:管道终止,当写入无人读取的管道时产生该信号,默认终止进程

我们必须接接管,比如客户端停止的时候,服务端还不知道,我们写入无人读取

会导致中断

python流媒体服务器 流媒体服务器开发框架_#include_02

2.SIGCHLD 子进程结束或停止时发送

python流媒体服务器 流媒体服务器开发框架_webrtc_03

用wait等待或者接手sigchld,否则会产生僵尸进程

3.SIGALRM 定时器信号,以秒为单位,默认终止进程

4.SIGUSR1/SIGUSR2自定义,默认终止进程

5.SIGINT 键盘输入退出信号 ctrl+c

6.SIGQUIT 键盘输入的退出信号 ctrl+/

7.SIGHUP 控制终端的挂起信号

发送信号

python流媒体服务器 流媒体服务器开发框架_tomcat_04

python流媒体服务器 流媒体服务器开发框架_#include_05

安装信号,就是捕获+处理信号

sig捕获的信号是多少,func是处理的函数

signal()

简单的捕获程序

signaltest.cpp


#include<iostream>
#include<signal.h>
#include<unistd.h>
void signalhandle(int sig)
{
    std::cout<<"sig:"<<sig<<std::endl;
}
int main(int argc,char * argv[])
{
   
    signal(SIGINT,signalhandle);
    signal(SIGQUIT,signalhandle);
    signal(SIGHUP,signalhandle);
    pause();
    return 0;
    
    
}

生成可执行文件

g++ -std=c++11 -g -o singaltest singaltest.cpp

运行

./singaltest

python流媒体服务器 流媒体服务器开发框架_python流媒体服务器_06

会发现可以捕获到SIGQUIT

sigaction()

python流媒体服务器 流媒体服务器开发框架_#include_07

结构体的内容

python流媒体服务器 流媒体服务器开发框架_服务器_08

act:

第一个用,跟signal调用的函数一样

第二个一般不用

sigset_tsa_mask 当执行action时候,有其他信号出现,要不要响应

sa_flag 一般设置为0,默认使用第一个函数

最后一个一般设置为NULL

oact:

不用设置,直接传初始的即可

testsigaction.cpp

#include<iostream>
#include<unistd.h>
#include<signal.h>
void sighandle(int sig)
{
    std::cout<<"sig:"<<sig<<std::endl;
}
int main(int argc,char* argv[])
{
    struct sigaction act,oact;
    act.sa_handler=sighandle;
    sigfillset(&act.sa_mask);
    //std::cout<<act.sa_mask<<std::endl;
    //std::cout<<&act.sa_mask<<std::endl;
    act.sa_flags=0;
    sigaction(SIGINT,&act,&oact);
    pause();
    return 0; 
}
生成可执行文件
g++ -std=c++11 -g -o testsigaction testsigaction.cpp
运行
./testsigaction

后台服务

假如在linux想把一个程序运行长久,那么就需要把程序放到后端

假如程序放在前端,那么终端结束时,程序会收到SIGHUP信号

代码中 fork 自己写版

fork方式 在程序代码中切换到后台

python流媒体服务器 流媒体服务器开发框架_服务器_09

tips:

chdir 等于程序中的cd

chdir(’ / ') 等于cd / 将跳到根目录

python流媒体服务器 流媒体服务器开发框架_python流媒体服务器_10

chdir( “~”) 等于cd ~ 跳到用户根目录

exit为C++的退出函数,声明于stdlib.h中,对于C++其标准的头文件为cstdlib,声明为
void exit(int value);
exit的功能为,退出当前运行的程序,并将参数value返回给主调进程。

exit(0)则是返回0。
exit(0)表示程序正常退出,非0表示非正常退出

fork() 申请子程序

setsid()调用成功后,返回新的会话的ID,调用setsid函数的进程成为新的会话的领头进程,并与其父进程的会话组和 进程组脱离。由于会话对控制终端的独占性,进程同时与控制终端脱离。

O_RDONLY 只读模式
O_WRONLY 只写模式
O_RDWR 读写模式

O_APPEND 每次写操作都写入文件的末尾

#include<fcntl.h>

open(file, O_…)

unistd.h 是 C 和 C++ 程序设计语言中提供对 POSIX 操作系统 API 的访问功能的头文件的名称。 fork pid_t setsid chdir

stdlib.h即standard library标准库头文件 exit

testdameon.cpp

#include<iostream>
#include<unistd.h>
#include<stdlib.h>
#include<fcntl.h>
void dameon(){
    pid_t pid;
    int fp;
    if ((pid= fork())<0)
    {
        std::cout<<"cant create child"<<std::endl;
    }
    else{
        if (pid!=0)//pid!=0 代表创建子程序成功
        {
            exit(0);//父程序退出
        }
    }
    setsid();

    if (chdir("/") <0)
    {
        std::cout<<"cant create dir";
        exit(-1);
    }

    fp=open("dev/null",O_RDWR);
    dup2(fp,STDIN_FILENO);//重定向输入
    dup2(fp,STDOUT_FILENO);//重定向输出
    dup2(fp,STDERR_FILENO);//重定向错误
    
int main(int argc,char* argv[])
{
   dameon();
   while(1){
    sleep(10);//10s
   }
   return 0;
}

查看后台的程序

tips: ps -ef|grep a

指令: ps
作用: 主要是查看服务器的进程信息
选项含义:
-e:等价于 ‘-A’ ,表示列出全部的进程
-f:显示全部的列(显示全字段)

| 代表管道,上一个的输出当作下一个指令的输入

grep 过滤 找 a 关键词

python流媒体服务器 流媒体服务器开发框架_#include_11

杀死后台的程序

tips:

杀死某一个程序
kill -9 pid

杀死某一个用户的全部程序
killall -u username

python流媒体服务器 流媒体服务器开发框架_webrtc_12

代码中 直接用daemon api

daemon 在 stdlib.h

python流媒体服务器 流媒体服务器开发框架_webrtc_13

nochdir 是否改变目录 0 是改变

noclose 是否重定向输入输出错误 0是重定向

dameon(0,0)

成功 返回0

否则返回 -1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DrvmJsjO-1657684052847)(file://C:\Users\hch\AppData\Roaming\marktext\images\2022-07-13-11-43-37-image.png?msec=1657683817285)]

终端内,tmux方式

tmux

tmux 可以在服务器后台开个窗口,即使断开与服务器的连接,也依然会运行。(跑模型很好用)

安装tmux

yum install tmux

开一个新的窗口

tmux

这样默认窗口名 为 顺序的 数字 0,1 ,2 ,3 ,4…

tmux new -s my-session

这样就有了一个叫my-session的窗口

一个窗口名下创建多个窗口

ctrl+b c

create

可以看到 此时有两个窗口,*表明此时在abc窗口的0号小窗口下

ctrl+b n

跳到下一个窗口 next

ctrl+b p

跳到下一个窗口 pre

ctrl+b 2

直接跳到2号小窗口

ctrl+b &

删除当前小窗口

查看所有的窗口

tmux list-sessions

删除某一个窗口

tmux kill-window -t 16

或者进入这个窗口 然后输入

exit

进入某一个窗口

tmux a -t 16