From e2c4b4e6a104162d3234c5e6a59756da254918dc Mon Sep 17 00:00:00 2001 From: lishu Date: Fri, 15 Mar 2019 16:59:18 +0800 Subject: [PATCH] =?UTF-8?q?1.=20keepalive=20add=20state=202.=20support=20U?= =?UTF-8?q?DP=20send=20in=20SOQ=203.=20=E4=B8=8A=E8=BF=B0=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=86=99=E5=85=A5=E5=AE=89=E8=A3=85=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=89=8B=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/conf/main.conf | 8 +- frag_rssb安装使用手册.docx | Bin 80365 -> 81685 bytes src/AV_sendback.h | 2 +- src/frag_send.c | 20 +- src/hard_keepalive.c | 376 ++++++++++++++++++++----------------- src/hard_keepalive.h | 7 +- src/log.c | 45 +++-- src/log.h | 3 + src/main.c | 14 +- src/main.h | 9 +- 10 files changed, 274 insertions(+), 210 deletions(-) diff --git a/bin/conf/main.conf b/bin/conf/main.conf index 0820712..8b8607e 100644 --- a/bin/conf/main.conf +++ b/bin/conf/main.conf @@ -27,6 +27,7 @@ UnixSocketRecvAddr=/home/mesasoft/frag_rssb/un_recv #udp socket:send frag +UdpSendSwitch=0 UdpSendIP=127.0.0.1;127.0.0.1; UdpSendIPNum=2 UdpSendPort=33082;33083 @@ -237,4 +238,9 @@ capacity=32 cost=32 wlb_report_interval=10 -bfd_recv_port=0 +/*¶Ë¿ÚΪ0±íʾ²»¿ªÆô±£»î¹¦ÄÜ*/ +bfd_recv_port=3785 +/*wait_queueÉèÖõĹÊÕÏãÐÖµ*/ +down_threshold=90 +/*¹ÊÕÏÅж¨´ÎÊý*/ +down_num=20 diff --git a/frag_rssb安装使用手册.docx b/frag_rssb安装使用手册.docx index 4e34160e03b4fa3e1ef1fe0a1fda3086ed20f70a..0be6b1b0d21ee07d8659edb490f60be225b41df0 100644 GIT binary patch delta 15319 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 diff --git a/src/AV_sendback.h b/src/AV_sendback.h index 07de83b..151c1a8 100644 --- a/src/AV_sendback.h +++ b/src/AV_sendback.h @@ -22,7 +22,7 @@ #define PROTOCOL_MMS 0x09 #define PROTOCOL_RTMP 0x0A #define PROTOCOL_SIP 0x0B - + /*ýÌåÀàÐÍ*/ #define MEDIA_TYPE_UNKNOWN 0x00 /*ýÌåÀàÐÍ:ÊÓÆµÖ§³ÖµÄýÌåÀàÐÍ*/ diff --git a/src/frag_send.c b/src/frag_send.c index f13b68d..58b053c 100644 --- a/src/frag_send.c +++ b/src/frag_send.c @@ -271,14 +271,16 @@ void send_data_by_unixsocket(const char* data, uint32_t datalen, int thread_id) } void send_data(const char* data, uint32_t datalen, int thread_id) -{ - /*²ÉÓÃUDP»Ø´«*/ -#if K_PROJECT - send_data_by_udp(data, datalen, thread_id); - /*²ÉÓÃunix socket»Ø´«*/ -#else - send_data_by_unixsocket(data, datalen, thread_id); -#endif +{ + if(g_frag_cfg.send_udp_switch) + { + send_data_by_udp(data, datalen, thread_id); + } + else + { + /*²ÉÓÃunix socket»Ø´«*/ + send_data_by_unixsocket(data, datalen, thread_id); + } } void send_data_bizman(const char* data, uint32_t datalen, uint64_t mid,uint32_t ip, int thread_id) @@ -660,7 +662,7 @@ void pack_and_send_media_info(media_info_t* media_info, frag_in_t* frg, int thre if(g_frag_run.usm_on_flag) { send_data_usm(sendbuf,sendbuflen,thread_id); - } + } else { send_data(sendbuf, sendbuflen, thread_id); diff --git a/src/hard_keepalive.c b/src/hard_keepalive.c index ded8991..e25fbea 100644 --- a/src/hard_keepalive.c +++ b/src/hard_keepalive.c @@ -1,174 +1,202 @@ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include //offsetof - -#include "hard_keepalive.h" - -int udp_socket_recv(int sockfd, uint32_t *src_ip, uint16_t *src_port, uint8_t *buf, uint32_t buf_size) -{ - if (NULL == buf) return -1; - - int numbytes; - struct sockaddr_storage their_addr; - socklen_t addr_len = sizeof(their_addr); - - if ((numbytes = recvfrom(sockfd, buf, buf_size , 0,(struct sockaddr *)&their_addr, &addr_len)) == -1) - { - perror("recvfrom"); - return -1; - } - *src_ip = ((struct sockaddr_in *)&their_addr)->sin_addr.s_addr; - *src_port = ((struct sockaddr_in *)&their_addr)->sin_port; - return numbytes; -} - -// send udp packet -int udp_socket_send(int sockfd, uint32_t addr, uint16_t port, char *data, int datalen) -{ - struct sockaddr_in dst_addr; /* connector's address information */ - dst_addr.sin_family = AF_INET; /* host byte order */ - dst_addr.sin_port = port; /* short, network byte order */ - dst_addr.sin_addr.s_addr = addr; - bzero(&(dst_addr.sin_zero), 8); /* zero the rest of the struct */ - int to_send_len=datalen; - int already_sended_len=0; - while(to_send_len>0) - { - already_sended_len=sendto(sockfd,data, - to_send_len-already_sended_len, - 0, - (struct sockaddr *)&(dst_addr), - sizeof(dst_addr)); - if(already_sended_len==-1) - { - if((EAGAIN == errno)||( EINTR == errno )|| (EWOULDBLOCK==errno)) - { - continue; - } - else - { - return -1; - } - } - to_send_len-=already_sended_len; - } - return already_sended_len; -} - -int create_recv_udp_socket(uint16_t port) -{ - int sockfd = socket(AF_INET, SOCK_DGRAM, 0); - if (-1 == sockfd) - { - perror("listener: socket"); - return -1; - } - struct sockaddr_in my_addr; /* my address information */ - my_addr.sin_family = AF_INET; /* host byte order */ - my_addr.sin_port = port; /* short, network byte order */ - my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */ - bzero(&(my_addr.sin_zero), 8); /* zero the rest of the struct */ - - if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) - { - perror("listener: bind"); - close(sockfd); - return -1; - } - return sockfd; -} - -void* thread_hard_keepalive(void *param) -{ - char buf[1500] = {0}; - char discriminator_temp[ID_SIZE] = {0}; - bfd_port_t* bfd_port = (bfd_port_t*)param; - int size = 0; - uint32_t src_ip = 0; - uint16_t src_port = 0; - int send_rec = 0; - fd_set rset; - int recv_pkt_sd = create_recv_udp_socket(htons(bfd_port->recv_port)); - - if(-1==recv_pkt_sd) - { - printf("hard_keepalive create socket error.\n"); - return NULL; - } - - while(1) - { - FD_ZERO(&rset); - FD_SET(recv_pkt_sd,&rset); - if(-1==select(recv_pkt_sd+1,&rset,NULL,NULL,NULL)) - { - continue; - } - if(FD_ISSET(recv_pkt_sd, &rset)) - { - size = udp_socket_recv(recv_pkt_sd, &src_ip, &src_port, (unsigned char*)buf, sizeof(buf)); - if(size>0) - { - /*½»»»discriminator*/ - memcpy(discriminator_temp, buf+MY_ID_OFFSET, ID_SIZE); - memcpy(buf+MY_ID_OFFSET, buf+YOUR_ID_OFFSET, ID_SIZE); - memcpy(buf+YOUR_ID_OFFSET, discriminator_temp, ID_SIZE); - send_rec = udp_socket_send(recv_pkt_sd, - src_ip, - src_port, - (char*)buf,size); - if(-1==send_rec) - { - printf("hard_keepalive send pkt error.\n"); - } - } - } - else - { - continue; - } - } - - return NULL; -} - -int hard_keepalive_run(void* bfd_port) -{ - pthread_t thread_desc; - pthread_attr_t attr; - - memset(&thread_desc, 0, sizeof(thread_desc)); - memset(&attr, 0, sizeof(attr)); - - if(0 != pthread_attr_init(&(attr))) - { - return -1; - } - if(0 != pthread_attr_setdetachstate(&(attr), PTHREAD_CREATE_DETACHED)) - { - return -1; - } - if(0 != pthread_create(&(thread_desc), &(attr), thread_hard_keepalive, (void*)bfd_port)) - { - pthread_attr_destroy(&(attr)); - return -1; - } - pthread_attr_destroy(&(attr)); - return 0; -} - + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include //offsetof + +#include "hard_keepalive.h" +#include "main.h" + +extern frag_rssb_parameter_t g_frag_run; +extern frag_rssb_configure_t g_frag_cfg; +extern frag_rssb_status_t g_frag_stat; + + +int udp_socket_recv(int sockfd, uint32_t *src_ip, uint16_t *src_port, uint8_t *buf, uint32_t buf_size) +{ + if (NULL == buf) return -1; + + int numbytes; + struct sockaddr_storage their_addr; + socklen_t addr_len = sizeof(their_addr); + + if ((numbytes = recvfrom(sockfd, buf, buf_size , 0,(struct sockaddr *)&their_addr, &addr_len)) == -1) + { + perror("recvfrom"); + return -1; + } + *src_ip = ((struct sockaddr_in *)&their_addr)->sin_addr.s_addr; + *src_port = ((struct sockaddr_in *)&their_addr)->sin_port; + return numbytes; +} + +// send udp packet +int udp_socket_send(int sockfd, uint32_t addr, uint16_t port, char *data, int datalen) +{ + struct sockaddr_in dst_addr; /* connector's address information */ + dst_addr.sin_family = AF_INET; /* host byte order */ + dst_addr.sin_port = port; /* short, network byte order */ + dst_addr.sin_addr.s_addr = addr; + bzero(&(dst_addr.sin_zero), 8); /* zero the rest of the struct */ + int to_send_len=datalen; + int already_sended_len=0; + while(to_send_len>0) + { + already_sended_len=sendto(sockfd,data, + to_send_len-already_sended_len, + 0, + (struct sockaddr *)&(dst_addr), + sizeof(dst_addr)); + if(already_sended_len==-1) + { + if((EAGAIN == errno)||( EINTR == errno )|| (EWOULDBLOCK==errno)) + { + continue; + } + else + { + return -1; + } + } + to_send_len-=already_sended_len; + } + return already_sended_len; +} + +int create_recv_udp_socket(uint16_t port) +{ + int sockfd = socket(AF_INET, SOCK_DGRAM, 0); + if (-1 == sockfd) + { + perror("listener: socket"); + return -1; + } + struct sockaddr_in my_addr; /* my address information */ + my_addr.sin_family = AF_INET; /* host byte order */ + my_addr.sin_port = port; /* short, network byte order */ + my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */ + bzero(&(my_addr.sin_zero), 8); /* zero the rest of the struct */ + + if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) + { + perror("listener: bind"); + close(sockfd); + return -1; + } + return sockfd; +} + +void* thread_hard_keepalive(void *param) +{ + char buf[1500] = {0}; + char discriminator_temp[ID_SIZE] = {0}; + bfd_port_t* bfd_port = (bfd_port_t*)param; + int size = 0; + uint32_t src_ip = 0; + uint16_t src_port = 0; + int send_rec = 0; + fd_set rset; + int recv_pkt_sd = create_recv_udp_socket(htons(bfd_port->recv_port)); + + if(-1==recv_pkt_sd) + { + printf("hard_keepalive create socket error.\n"); + return NULL; + } + + while(1) + { + FD_ZERO(&rset); + FD_SET(recv_pkt_sd,&rset); + if(-1==select(recv_pkt_sd+1,&rset,NULL,NULL,NULL)) + { + continue; + } + if(FD_ISSET(recv_pkt_sd, &rset)) + { + size = udp_socket_recv(recv_pkt_sd, &src_ip, &src_port, (unsigned char*)buf, sizeof(buf)); + if(size>0) + { + /*½»»»discriminator*/ + memcpy(discriminator_temp, buf+MY_ID_OFFSET, ID_SIZE); + memcpy(buf+MY_ID_OFFSET, buf+YOUR_ID_OFFSET, ID_SIZE); + memcpy(buf+YOUR_ID_OFFSET, discriminator_temp, ID_SIZE); + /*·¢ËͶÓÁÐstate״̬*/ + int state = 0; + for(int i=0;iflags,8); + setbit(((bfd_header_t*)buf )->flags,7); + printf("wait_queue is overflow, app is down.\n"); + MESA_handle_runtime_log(g_frag_run.logger, RLOG_LV_FATAL, FRAG_REASSEMBLY_MODULE_NAME, + "{%s:%d} wait_queue is overflow, app is down.", + __FILE__,__LINE__); + } + else + { + /*STATE_UP 2bit: 1 1*/ + setbit(((bfd_header_t*)buf )->flags,8); + setbit(((bfd_header_t*)buf )->flags,7); + } + send_rec = udp_socket_send(recv_pkt_sd, + src_ip, + src_port, + (char*)buf,size); + if(-1==send_rec) + { + printf("hard_keepalive send pkt error.\n"); + } + } + } + else + { + continue; + } + } + + return NULL; +} + +int hard_keepalive_run(void* bfd_port) +{ + pthread_t thread_desc; + pthread_attr_t attr; + + memset(&thread_desc, 0, sizeof(thread_desc)); + memset(&attr, 0, sizeof(attr)); + + if(0 != pthread_attr_init(&(attr))) + { + return -1; + } + if(0 != pthread_attr_setdetachstate(&(attr), PTHREAD_CREATE_DETACHED)) + { + return -1; + } + if(0 != pthread_create(&(thread_desc), &(attr), thread_hard_keepalive, (void*)bfd_port)) + { + pthread_attr_destroy(&(attr)); + return -1; + } + pthread_attr_destroy(&(attr)); + return 0; +} + diff --git a/src/hard_keepalive.h b/src/hard_keepalive.h index 7eaa7d3..22f08c2 100644 --- a/src/hard_keepalive.h +++ b/src/hard_keepalive.h @@ -10,10 +10,15 @@ typedef struct bfd_port_s #define MY_ID_OFFSET 4 #define YOUR_ID_OFFSET 8 #define ID_SIZE 4 + +#define setbit(x,y) x|=(1<> (y)&1) + typedef struct bfd_header_s { unsigned char version_diag; - unsigned char flags; + unsigned char flags; /*flagǰ2bitÊÇstate*/ unsigned char detect_time_multiplier; unsigned char length; unsigned char my_discriminator[4]; /* Òµ?º? ²²â*/ diff --git a/src/log.c b/src/log.c index 1439e38..c0997f9 100644 --- a/src/log.c +++ b/src/log.c @@ -194,23 +194,25 @@ void* thread_stat_output(void *param) char buf[32] = {0}; int send_dest_num = 0; -#if K_PROJECT - send_dest_num = g_frag_cfg.send_dest_udp_ip_num; - for(uint32_t m=0;m0) { for(i=0; i