From f292da01f29e8ccc7d72aad6ca13ee0e4a59c7e4 Mon Sep 17 00:00:00 2001 From: lishu Date: Mon, 8 Oct 2018 13:23:27 +0800 Subject: [PATCH 1/2] keepalive --- src/hard_keepalive.c | 26 ++++++++------------------ src/main.c | 8 +++----- src/main.h | 1 - 3 files changed, 11 insertions(+), 24 deletions(-) diff --git a/src/hard_keepalive.c b/src/hard_keepalive.c index 5b90867..ded8991 100644 --- a/src/hard_keepalive.c +++ b/src/hard_keepalive.c @@ -19,7 +19,7 @@ #include "hard_keepalive.h" -int udp_socket_recv(int sockfd, uint32_t *src_ip, uint8_t *buf, uint32_t buf_size) +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; @@ -32,7 +32,8 @@ int udp_socket_recv(int sockfd, uint32_t *src_ip, uint8_t *buf, uint32_t buf_siz perror("recvfrom"); return -1; } - *src_ip = ((struct sockaddr_in *)&their_addr)->sin_addr.s_addr; + *src_ip = ((struct sockaddr_in *)&their_addr)->sin_addr.s_addr; + *src_port = ((struct sockaddr_in *)&their_addr)->sin_port; return numbytes; } @@ -92,17 +93,6 @@ int create_recv_udp_socket(uint16_t port) return sockfd; } - -int create_send_udp_socket() -{ - int sockfd = socket(AF_INET, SOCK_DGRAM, 0); - if (-1 == sockfd) - { - return -1; - } - return sockfd; -} - void* thread_hard_keepalive(void *param) { char buf[1500] = {0}; @@ -110,12 +100,12 @@ void* thread_hard_keepalive(void *param) 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)); - int send_pkt_sd = create_send_udp_socket(); - if(-1==recv_pkt_sd || -1==send_pkt_sd) + if(-1==recv_pkt_sd) { printf("hard_keepalive create socket error.\n"); return NULL; @@ -131,16 +121,16 @@ void* thread_hard_keepalive(void *param) } if(FD_ISSET(recv_pkt_sd, &rset)) { - size = udp_socket_recv(recv_pkt_sd, &src_ip, (unsigned char*)buf, sizeof(buf)); + 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(send_pkt_sd, + send_rec = udp_socket_send(recv_pkt_sd, src_ip, - htons(bfd_port->send_port), + src_port, (char*)buf,size); if(-1==send_rec) { diff --git a/src/main.c b/src/main.c index dd93bb3..a93b964 100644 --- a/src/main.c +++ b/src/main.c @@ -42,8 +42,8 @@ const char* frag_rssb_version = "2018-08-13T09:00:00"; const char* frag_rssb_version_time = "2018-08-13T09:00:00"; const char* frag_rssb_version_des = "MESA@iie rssb_maskey"; -int FRAG_RSSB_VERSION_1_0_20180927 = 0; -const char* frag_rssb_version_time_in = "2018-09-27"; +int FRAG_RSSB_VERSION_1_0_20181008 = 0; +const char* frag_rssb_version_time_in = "2018-10-08"; const char* frag_rssb_version_des_in = "hard balance"; void frag_rssb_history() { @@ -741,7 +741,6 @@ int read_conf_and_init(const char* filename) MESA_load_profile_uint_def(filename, "WLB", "wlb_report_interval", (unsigned int*)&g_frag_cfg.wlb_report_interval,10); MESA_load_profile_uint_def(filename, "WLB", "enable_override", (unsigned int*)&g_frag_cfg.enable_override,0); MESA_load_profile_uint_def(filename, "WLB", "bfd_recv_port", (unsigned int*)&g_frag_cfg.bfd_recv_port,0); - MESA_load_profile_uint_def(filename, "WLB", "bfd_send_port", (unsigned int*)&g_frag_cfg.bfd_send_port,0); /*send bizman :粗拼装往前端发数据,监听响应端口*/ MESA_load_profile_short_def(filename, "NETWORK", "BizmanAckPort", (short*)&g_frag_cfg.bizman_ack_port,22084); @@ -1282,11 +1281,10 @@ int main(int argc, char **argv) } } - if(g_frag_cfg.bfd_recv_port>0 && g_frag_cfg.bfd_send_port>0) + if(g_frag_cfg.bfd_recv_port>0) { bfd_port_t bfd_port; bfd_port.recv_port = g_frag_cfg.bfd_recv_port; - bfd_port.send_port = g_frag_cfg.bfd_send_port; hard_keepalive_run(&bfd_port); } diff --git a/src/main.h b/src/main.h index 0a06c3d..8d25ad6 100644 --- a/src/main.h +++ b/src/main.h @@ -242,7 +242,6 @@ typedef struct frag_rssb_configure_s int16_t save_media; uint32_t bfd_recv_port; - uint32_t bfd_send_port; }frag_rssb_configure_t; typedef struct frag_rssb_status_s From dc05b5fd01b818daacd870f60238571549b7b339 Mon Sep 17 00:00:00 2001 From: lishu Date: Mon, 8 Oct 2018 16:16:22 +0800 Subject: [PATCH 2/2] 20181008 survey_k --- src/tool/sendsurvey_k/AV_sendback.h | 198 ++++++++++ src/tool/sendsurvey_k/Makefile | 41 ++ src/tool/sendsurvey_k/common.a | Bin 0 -> 60528 bytes src/tool/sendsurvey_k/common/Makefile | 24 ++ src/tool/sendsurvey_k/common/debug.h | 25 ++ src/tool/sendsurvey_k/common/error.c | 25 ++ src/tool/sendsurvey_k/common/error.h | 17 + src/tool/sendsurvey_k/common/input.c | 114 ++++++ src/tool/sendsurvey_k/common/input.h | 13 + src/tool/sendsurvey_k/common/ioctl_op.c | 45 +++ src/tool/sendsurvey_k/common/ioctl_op.h | 6 + src/tool/sendsurvey_k/common/loadprof.c | 452 +++++++++++++++++++++++ src/tool/sendsurvey_k/common/loadprof.h | 120 ++++++ src/tool/sendsurvey_k/common/log.c | 49 +++ src/tool/sendsurvey_k/common/log.h | 12 + src/tool/sendsurvey_k/common/output.c | 206 +++++++++++ src/tool/sendsurvey_k/common/output.h | 18 + src/tool/sendsurvey_k/common/un_server | Bin 0 -> 12685 bytes src/tool/sendsurvey_k/common/un_server.c | 90 +++++ src/tool/sendsurvey_k/readme.txt | 8 + src/tool/sendsurvey_k/sendsurvey | Bin 0 -> 21516 bytes src/tool/sendsurvey_k/sendsurvey.c | 94 +++++ 22 files changed, 1557 insertions(+) create mode 100644 src/tool/sendsurvey_k/AV_sendback.h create mode 100644 src/tool/sendsurvey_k/Makefile create mode 100644 src/tool/sendsurvey_k/common.a create mode 100644 src/tool/sendsurvey_k/common/Makefile create mode 100644 src/tool/sendsurvey_k/common/debug.h create mode 100644 src/tool/sendsurvey_k/common/error.c create mode 100644 src/tool/sendsurvey_k/common/error.h create mode 100644 src/tool/sendsurvey_k/common/input.c create mode 100644 src/tool/sendsurvey_k/common/input.h create mode 100644 src/tool/sendsurvey_k/common/ioctl_op.c create mode 100644 src/tool/sendsurvey_k/common/ioctl_op.h create mode 100644 src/tool/sendsurvey_k/common/loadprof.c create mode 100644 src/tool/sendsurvey_k/common/loadprof.h create mode 100644 src/tool/sendsurvey_k/common/log.c create mode 100644 src/tool/sendsurvey_k/common/log.h create mode 100644 src/tool/sendsurvey_k/common/output.c create mode 100644 src/tool/sendsurvey_k/common/output.h create mode 100644 src/tool/sendsurvey_k/common/un_server create mode 100644 src/tool/sendsurvey_k/common/un_server.c create mode 100644 src/tool/sendsurvey_k/readme.txt create mode 100644 src/tool/sendsurvey_k/sendsurvey create mode 100644 src/tool/sendsurvey_k/sendsurvey.c diff --git a/src/tool/sendsurvey_k/AV_sendback.h b/src/tool/sendsurvey_k/AV_sendback.h new file mode 100644 index 0000000..e14bb7e --- /dev/null +++ b/src/tool/sendsurvey_k/AV_sendback.h @@ -0,0 +1,198 @@ +#ifndef _AV_SENDBACK_H +#define _AV_SENDBACK_H + +/*魔数*/ +#define AV_MAGIC_VALUE 0x8739 + +/*消息类型*/ +#define AV_TYPE_META 0x01 +#define AV_TYPE_DATA 0x02 +#define AV_TYPE_RESULT 0x11 + +/*协议类型*/ +#define PROTOCOL_DEFAULT 0x00 +#define PROTOCOL_HTTP 0x01 +#define PROTOCOL_SMTP 0x02 +#define PROTOCOL_POP3 0x03 +#define PROTOCOL_IMAP 0x04 +#define PROTOCOL_FTP 0x05 +#define PROTOCOL_HTTP_PIC 0x06 +#define PROTOCOL_RTSP_RDT 0x07 +#define PROTOCOL_RTSP_RTP 0x08 +#define PROTOCOL_MMS 0x09 +#define PROTOCOL_RTMP 0x0A +#define PROTOCOL_SIP 0x0B + +/*媒体类型*/ +#define MEDIA_TYPE_UNKNOWN 0x00 +/*媒体类型:视频支持的媒体类型*/ +#define MEDIA_TYPE_VIDEO 0x01 +#define MEDIA_TYPE_WMV 0x02 +#define MEDIA_TYPE_MPG 0x03 +#define MEDIA_TYPE_FLV 0x04 +#define MEDIA_TYPE_RMFF 0x05 +#define MEDIA_TYPE_AVI 0x06 +#define MEDIA_TYPE_SWF 0x07 +#define MEDIA_TYPE_MPG4 0x08 +#define MEDIA_TYPE_AIFF 0x09 +#define MEDIA_TYPE_OGG 0x0A +#define MEDIA_TYPE_DRC 0x0B +#define MEDIA_TYPE_DIRECTSHOW 0x0C +#define MEDIA_TYPE_FLIC 0x0E +#define MEDIA_TYPE_INDEO 0x0F +#define MEDIA_TYPE_MKV 0x10 +/*媒体类型:音频支持的媒体类型*/ +#define MEDIA_TYPE_AUDIO 0x20 +#define MEDIA_TYPE_MP3 0x21 +/*媒体类型:图片支持的媒体类型*/ +#define MEDIA_TYPE_IMAGE 0x30 +#define MEDIA_TYPE_JPG 0x31 +#define MEDIA_TYPE_BMP 0x32 +#define MEDIA_TYPE_GIF 0x33 +/*媒体类型:实时流媒体支持的媒体类型*/ +#define MEDIA_TYPE_MMS 0x40 +#define MEDIA_TYPE_RTSP_RDT 0x41 +#define MEDIA_TYPE_RTSP_RTP 0x42 +/*媒体类型:碎片化音视频支持的媒体类型*/ +#define MEDIA_TYPE_OSMF 0x50 +#define MEDIA_TYPE_HLS 0x51 +/*媒体类型:VOIP支持的媒体类型,亦即编码类型*/ +#define MEDIA_TYPE_AUDIO_UNKNOWN 0x60 +#define MEDIA_TYPE_AUDIO_G711_ULAW 0x61 +#define MEDIA_TYPE_AUDIO_G711_ALAW 0x62 +#define MEDIA_TYPE_AUDIO_G722 0x63 +#define MEDIA_TYPE_AUDIO_G723 0x64 +#define MEDIA_TYPE_AUDIO_G726_40 0x65 +#define MEDIA_TYPE_AUDIO_G726_32 0x66 +#define MEDIA_TYPE_AUDIO_G726_24 0x67 +#define MEDIA_TYPE_AUDIO_G726_16 0x68 +#define MEDIA_TYPE_AUDIO_AAL2_G726_40 0x69 +#define MEDIA_TYPE_AUDIO_AAL2_G726_32 0x6A +#define MEDIA_TYPE_AUDIO_AAL2_G726_24 0x6B +#define MEDIA_TYPE_AUDIO_AAL2_G726_16 0x6C +#define MEDIA_TYPE_AUDIO_G728 0x6D +#define MEDIA_TYPE_AUDIO_G729D 0x6E +#define MEDIA_TYPE_AUDIO_G729E 0x6F +#define MEDIA_TYPE_AUDIO_GSM 0x70 +#define MEDIA_TYPE_AUDIO_GSM_EFR 0x71 +#define MEDIA_TYPE_AUDIO_ILBC 0x72 +#define MEDIA_TYPE_AUDIO_AMR 0x73 +#define MEDIA_TYPE_AUDIO_AMR_WB 0x74 +#define MEDIA_TYPE_AUDIO_SILK 0x75 +#define MEDIA_TYPE_AUDIO_LPC 0x76 +#define MEDIA_TYPE_AUDIO_LPC1016 0x77 +#define MEDIA_TYPE_AUDIO_LPC1015 0x78 +#define MEDIA_TYPE_AUDIO_L16 0x79 +#define MEDIA_TYPE_AUDIO_SPEEX 0x7A +#define MEDIA_TYPE_AUDIO_L8 0x7B +#define MEDIA_TYPE_AUDIO_MPA 0x7C +#define MEDIA_TYPE_AUDIO_DVI4 0x7D +#define MEDIA_TYPE_AUDIO_VDVI 0x7E +#define MEDIA_TYPE_AUDIO_CN 0x7F +#define MEDIA_TYPE_AUDIO_RED 0x80 +#define MEDIA_TYPE_AUDIO_QCELP 0x81 +#define MEDIA_TYPE_AUDIO_EVRC0 0x82 +#define MEDIA_TYPE_AUDIO_EVRCB0 0x83 +#define MEDIA_TYPE_AUDIO_G729 0x84 +#define MEDIA_TYPE_AUDIO_VIVOX 0x85 + +/*指导消息体选项类型*/ +/*指导消息体选项类型-VOIP选项类型*/ +#define OPT_SIP_SEND_RATE_INFO 0x71 /*VOIP编码参数信息*/ + +/*==================================消息头部==============================================*/ +typedef struct msg_head_s +{ + uint16_t magic; + uint16_t m_type; + uint32_t c_len; //消息体长度(不包括消息头部) +}msg_head_t; + +/*==================================指导消息体==============================================*/ +typedef struct msg_meta_s +{ + char pid[8]; //ID,由数据获取节点生成 + uint64_t proglen; //流文件的总字节长度,为0表示长度未知 + uint32_t capip; // 获取节点的IP + uint8_t protocol; // 承载协议类型 + uint8_t mediatype; // 可能的媒体类型 + uint8_t data_flag; // 数据标志 + uint8_t opt_num; // 选项个数 +}msg_meta_t; + +/*已经在其他文件里面定义过 +struct opt_unit_t +{ + uint32_t opt_len; //包括opt_len、opt_type、opt_value + uint8_t opt_type; + char* opt_value; +}; +*/ + +/*==================================流数据消息体==============================================*/ +typedef struct av_data_s +{ + char pid[8]; // 流文件的ID,由数据获取节点生成 + uint16_t frag_seq; // 音视频碎片:片段序号 VOIP:主被叫 + int64_t offset:48; // 本次数据在整个流文件中的偏移位置 + //char* avs; // 多媒体流数据 +}av_data_t; + +/*VOIP多媒体流数据格式*/ +struct voip_header_t +{ + uint32_t time_stamp; // 语音帧的时间戳, 网络序。 + uint32_t sequence; + //char* data; //VOIP的语音数据 +}; + +/*RTSP/RTMP多媒体流数据格式*/ +struct sdp_data_packet +{ + char sdp[8]; // 恒为"RTSP_SDP" + uint32_t sdp_len; // 为sdp的数据长度 + //char * data; // sdp数据内容 +}; + +/*RTSP sdp数据内容格式*/ +struct rtsp_data_packet +{ + uint32_t flag; // RTSP数据头开头标志 0x46464646 "FFFF" + uint8_t type; // 数据类型,1 for RDT,2 for RTP + uint8_t channel; // 数据的通道号 + uint16_t len; // 数据长度 + //char * data; // 数据内容 +}; + +/*RTMP sdp数据内容格式*/ +struct rtmp_data_packet +{ + uint32_t flag; // RTMP数据头开头标志 0x52544D50"RTMP" + uint32_t av_type:8; // 音视频类型,8 for Audio, 9 for Video + uint32_t cs_id:24; // Chunk Stream ID + uint32_t timestamp; // 时间戳 + uint32_t len; // 总数据长度(包括本头部字段长度,20字节) + uint32_t stream_id; // 流ID + //char * data; // 数据内容 +}; + +/*MMS多媒体流数据格式*/ +struct mms_data_packet +{ + uint32_t frame_flag; // 恒为0x46464646 "FFFF" + uint32_t data_len; // 为数据长度 + //char * data; // 数据内容H包数据内容或者D包数据内容 +}; + +/*==================================结果消息体==================================================*/ +typedef struct msg_result_s +{ + char pid[8]; // 本流文件的ID,由数据获取节点生成 + int servicetype; // 业务类型 + uint32_t cfgid; // 命中的配置ID,值为0表示命中未知配置 + int8_t level; // 检测结果置信度, [0, 100] + uint8_t pad[7]; // 预留,必须填0值 + //char* logindex; // 访问现场数据文件的存储路径URL,以"/0"结束 +}msg_result_t; + +#endif diff --git a/src/tool/sendsurvey_k/Makefile b/src/tool/sendsurvey_k/Makefile new file mode 100644 index 0000000..4ccb8b2 --- /dev/null +++ b/src/tool/sendsurvey_k/Makefile @@ -0,0 +1,41 @@ +# CREATED by Guo Le, 08/23/2010 +# +CC = gcc +PROGRAM = sendsurvey +CFLAGS = -g -Wall +INCLUDE = -I. -I./common +LDFLAGS = -lpthread -Wall +OBJS = backend.o +DEPLOY_DIR = /home/ictsoft/fake_backend +BUILD_DIR = ./debug + +.PHONY : all clean +all: $(PROGRAM) + + +sendsurvey: sendsurvey.c + gcc $(INCLUDE) $(LDFLAGS) -g -Wall sendsurvey.c common.a -o sendsurvey + +$(OBJS): %.o: %.c + $(CC) -c $(CFLAGS) $(INCLUDE) $< -o $@ + + +clean: + $(RM) *.o $(PROGRAM) + +localdeploy: $(PROGRAM) + @echo "- Kill previous process ---------------------------------------------" + @-killall -vq backend_video backend_audio; + @echo "---------------------------------------------------------------------" + @echo "- Check deploy dir --------------------------------------------------" + @if [ ! -d "$(DEPLOY_DIR)" ]; \ + then echo "DEPLOY_DIR doesn't exist!"; mkdir -p $(DEPLOY_DIR); \ + else echo "DEPLOY_DIR exist, remove all"; fi + @-rm -rfv $(DEPLOY_DIR)/* + @echo "---------------------------------------------------------------------" + @echo "- Deploy ------------------------------------------------------------" + @cp -rv $(BUILD_DIR)/* $(DEPLOY_DIR) + @echo "---------------------------------------------------------------------" + @echo "- Run ---------------------------------------------------------------" + @cd $(DEPLOY_DIR); ./r2; + @ps au | grep -e "backend" | grep -v grep diff --git a/src/tool/sendsurvey_k/common.a b/src/tool/sendsurvey_k/common.a new file mode 100644 index 0000000000000000000000000000000000000000..3549d7802c8b8da8159d686cc7c32e19e99b015c GIT binary patch literal 60528 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

)ESu)|2(wWZ^u29x(VoPdI4 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 z +#include +#include + +#ifdef _DEBUG_ +#define DEBUG_MESSAGE(msg) \ + fprintf(stderr, "[Debug]: %s(%d) " msg "\n", __FILE__, __LINE__) +#define DEBUG_PRINTF(fmt,...) \ + fprintf(stderr, "[Debug]: %s(%d) " fmt, __FILE__, __LINE__, __VA_ARGS__) +#else +#define DEBUG_MESSAGE(msg) +#define DEBUG_PRINTF(fmt,...) +#endif /* _DEBUG_ */ + +#ifdef _DEBUG_VERBOSE_ +#define DEBUG_WRAP(msg) msg +#else +#define DEBUG_WRAP(msg) +#endif /* _DEBUG_VERBOSE_ */ + + +#endif // #define _DEBUG_H_ diff --git a/src/tool/sendsurvey_k/common/error.c b/src/tool/sendsurvey_k/common/error.c new file mode 100644 index 0000000..c0bd4f1 --- /dev/null +++ b/src/tool/sendsurvey_k/common/error.c @@ -0,0 +1,25 @@ +// error.c +// +// +// +// MODIFIED by +// CREATED by Guo Le, 09/16/2010 + +#include "error.h" + +int error_flags = 0; + +void setabort() +{ + error_flags |= ERROR_FLAG_ABORT; +} +void unsetabort() +{ + error_flags &= ~ERROR_FLAG_ABORT; +} +int isabort() +{ + return error_flags & ERROR_FLAG_ABORT ? 1 : 0; +} + + diff --git a/src/tool/sendsurvey_k/common/error.h b/src/tool/sendsurvey_k/common/error.h new file mode 100644 index 0000000..cd7469a --- /dev/null +++ b/src/tool/sendsurvey_k/common/error.h @@ -0,0 +1,17 @@ +#ifndef _ERROR_H_ +#define _ERROR_H_ +#include +#include +#include + +#define ERROR_FLAG_ABORT 0x1 + +#define ERROR_MESSAGE(msg) \ + fprintf(stderr, "[Error]: " msg "\n") + +void setabort(); +void unsetabort(); +int isabort(); + + +#endif // #define _DEBUG_H_ diff --git a/src/tool/sendsurvey_k/common/input.c b/src/tool/sendsurvey_k/common/input.c new file mode 100644 index 0000000..e697371 --- /dev/null +++ b/src/tool/sendsurvey_k/common/input.c @@ -0,0 +1,114 @@ +// input.c +// +// +// +// MODIFIED by +// CREATED by Guo Le, 09/11/2010 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include //offsetof +#include "input.h" + + +int input_udp_init(uint16_t port) +{ + int sockfd = socket(AF_INET, SOCK_DGRAM, 0); + if (-1 == sockfd) { + //DEBUG_PRINTF("listener: socket %s", strerror()); + 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) { + //DEBUG_PRINTF("listener: bind %s", strerror()); + perror("listener: bind"); + close(sockfd); + return -1; + } + /* + if(fcntl(sockfd, F_SETFL, O_NONBLOCK) == -1) { + close(sockfd); + perror("fcntl"); + return -1; + } + */ + return sockfd; +} + +void input_udp_clear(int sockfd) +{ + close(sockfd); +} + + +int input_udp_recv(int sockfd, uint32_t *src_ip, 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; + //printf("listener: waiting to recvfrom...\n"); + 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; + return numbytes; +} +int init_input_un_socket(const char* file_name) +{ + int sd=-1; + int len; + struct sockaddr_un un; + if(strlen(file_name)+8>sizeof(un.sun_path)) + { + printf("Unix-domain socket file name too long.\n"); + return -1; + } + sd=socket(AF_UNIX,SOCK_DGRAM,0); + if(sd<0) + { + printf("Get Unix-domain socket error:%s\n",strerror(errno)); + return -1; + } + memset(&un,0,sizeof(un)); + un.sun_family=AF_UNIX; + + snprintf(un.sun_path,sizeof(un.sun_path),"%s",file_name); + len=offsetof(struct sockaddr_un,sun_path)+strlen(un.sun_path); + unlink(un.sun_path); + if(0>bind(sd,(struct sockaddr*)&un,len)) + { + printf("Bind Unix-domain socket error:%s\n",strerror(errno)); + return -1; + } + return sd; +} +int named_unix_domain_socket_recv(int un_sd,char*buf,int buf_len) +{ + int recv_len=0; + struct sockaddr_storage sa; + socklen_t sa_len; + recv_len=recvfrom(un_sd,buf,buf_len,0,(struct sockaddr*)&sa,&sa_len); + return recv_len; +} diff --git a/src/tool/sendsurvey_k/common/input.h b/src/tool/sendsurvey_k/common/input.h new file mode 100644 index 0000000..e3934df --- /dev/null +++ b/src/tool/sendsurvey_k/common/input.h @@ -0,0 +1,13 @@ +#ifndef _INPUT_H_ +#define _INPUT_H_ + +#include + +int input_udp_init(uint16_t port); + +void input_udp_clear(int sockfd); + +int input_udp_recv(int sockfd, uint32_t *src_ip, uint8_t *buf, uint32_t buf_size); +int init_input_un_socket(const char* file_name); +int named_unix_domain_socket_recv(int un_sd,char*buf,int buf_len); +#endif /* _INPUT_H_ */ diff --git a/src/tool/sendsurvey_k/common/ioctl_op.c b/src/tool/sendsurvey_k/common/ioctl_op.c new file mode 100644 index 0000000..8fc3917 --- /dev/null +++ b/src/tool/sendsurvey_k/common/ioctl_op.c @@ -0,0 +1,45 @@ +// ioctl_op.c +// +// +// +// MODIFIED by +// CREATED by Guo Le, 11/29/2010 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "debug.h" + +unsigned int getipbyifname(const char *ifname) +{ + int sockfd; + struct ifreq ifr; + unsigned int ip; + + sockfd = socket(AF_INET, SOCK_DGRAM, 0); + if (-1 == sockfd) { + perror("socket"); + goto error; + } + + strcpy(ifr.ifr_name,ifname); + if (ioctl(sockfd, SIOCGIFADDR, &ifr) < 0) { + perror("ioctl"); + goto error; + } + + ip = ((struct sockaddr_in*)&(ifr.ifr_addr))->sin_addr.s_addr; + close(sockfd); + return ip; + +error: + close(sockfd); + return INADDR_NONE; +} diff --git a/src/tool/sendsurvey_k/common/ioctl_op.h b/src/tool/sendsurvey_k/common/ioctl_op.h new file mode 100644 index 0000000..568d21e --- /dev/null +++ b/src/tool/sendsurvey_k/common/ioctl_op.h @@ -0,0 +1,6 @@ +#ifndef _IOCTL_OP_H_ +#define _IOCTL_OP_H_ + +unsigned int getipbyifname(const char *ifname); + +#endif /*_IOCTL_OP_H_*/ diff --git a/src/tool/sendsurvey_k/common/loadprof.c b/src/tool/sendsurvey_k/common/loadprof.c new file mode 100644 index 0000000..7449215 --- /dev/null +++ b/src/tool/sendsurvey_k/common/loadprof.c @@ -0,0 +1,452 @@ +// loadprof.c +// +// general routines to read in profile +// +// CREATED by Guo Le, 2010-12-15 + + +#include +#include +#include +#include +#include + +#include "loadprof.h" + +#ifdef WIN32 +#define strncasecmp(x,y,z) memicmp(x,y,z) +#endif + + +// seek specified section in initialization file, +// file read pointer at beginning of next line +// +// Return: +// >= 0 : success +// < 0 : error +static int seek_section( + FILE *fp, // [IN] initialization file descriptor + const char *section) // [IN] section name in initialization file +{ + char line[MAX_PROF_LINE]; + unsigned int i, j; + char *pc; + + i = strlen(section); + while (NULL != fgets(line, MAX_PROF_LINE, fp)) { + pc = line; + while (' ' == *pc || '\t' == *pc) + pc++; // cut prefixal space chars + if (SECTION_PRE != *pc) + continue; + pc ++; + j = strlen(pc); + if (j < (i + 1) || SECTION_POST != pc[i]) + continue; + if (strncasecmp(section, pc, i)) + continue; + return 0; + } + return -1; +} + + + +// seek specified key in initialization file +// +// Return: +// >= 0 : success +// < 0 : error +static int seek_key( + FILE *fp, // [IN] initialization file descriptor + const char *key, // [IN] key name in initialization file + char *line) // [OUT] key value string +{ + unsigned int i, j; + char *pc; + + i = strlen(key); + *line = '\0'; + while (NULL != fgets(line, MAX_PROF_LINE, fp)) { + pc = line; + while (' ' == *pc || '\t' == *pc) + pc++; // cut prefixal space chars + if (SECTION_PRE == *pc) // next section + return -1; + j = strlen(pc); + if (j < i) + continue; + if (strncasecmp(key, pc, i)) + continue; + pc += i; + while (' ' == *pc || '\t' == *pc) + pc++; + if (VALUE_SET != *pc) + continue; + pc++; + j = strlen(pc); + if (j < 1) + return 0; + memmove(line, pc, j); + line[j] = '\0'; + return 1; + } + return -1; +} + + + +// Read in specified integer value +// +// Return: +// >= 0 : success +// < 0 : error, val is set to default +int profile_read_int( + const char *file, // [IN] initialization file path + const char *section, // [IN] section name in initialization file + const char *key, // [IN] keyword name in initialization file + int *val, // [OUT] returned value + int dval) // [IN] default value +{ + char line[MAX_PROF_LINE]; + FILE *fp; + + *val = dval; + fp = fopen(file, "r"); + if (NULL == fp) + return -1; + if (seek_section(fp, section) < 0) { + fclose(fp); + return -2; + } + if (seek_key(fp, key, line) < 0) { + fclose(fp); + return -3; + } + *val = strtol(line, NULL, 0); + return 0; +} + + + +// Read in specified unsigned integer value +// +// Return: +// >= 0 : success +// < 0 : error, val is set to default +int profile_read_uint( + const char *file, // [IN] initialization file path + const char *section, // [IN] section name in initialization file + const char *key, // [IN] keyword name in initialization file + unsigned int *val, // [OUT] returned value + unsigned int dval) // [IN] default value +{ + char line[MAX_PROF_LINE]; + FILE *fp; + + *val = dval; + fp = fopen(file, "r"); + if (NULL == fp) + return -1; + if (seek_section(fp, section) < 0) { + fclose(fp); + return -2; + } + if (seek_key(fp, key, line) < 0) { + fclose(fp); + return -3; + } + *val = strtoul(line, NULL, 0); + return 0; +} + + + +// Read in specified string value, +// if value string is too long to return, extra chars truncated. +// prefix/postfix space chars cutted, +// space chars: ' ', '\t' +// +// Return: +// >= 0 : length of val +// < 0 : error, str is set to default +int profile_read_string( + const char *file, // [IN] initialization file path + const char *section, // [IN] section name in initialization file + const char *key, // [IN] keyword name in initialization file + char *str, // [OUT] returned string + size_t size, // [IN] buffer size(bytes) + const char *dstr) // [IN] default string +{ + char line[MAX_PROF_LINE]; + FILE *fp; + size_t i; + char *pc; + + if (0 == size) { + *str = '\0'; + return 0; + } + i = strlen(dstr); + if (i > size - 1) { + return -1; + } + strcpy(str, dstr); + fp = fopen(file, "r"); + if (NULL == fp) + return -1; + if (seek_section(fp, section) < 0) { + fclose(fp); + return -2; + } + if (seek_key(fp, key, line) < 0) { + fclose(fp); + return -3; + } + fclose(fp); + pc = line; + while (' ' == *pc || '\t' == *pc) + pc++; // cut prefixal space chars + i = strlen(pc); + if (i < 1) + return 0; + if ('\n' == pc[i - 1]) + i --; // cut pending '\n' + while (' ' == pc[i - 1] || '\t' == pc[i - 1]) { + i --; // cut pending space chars + if (i < 1) { + *str = '\0'; + return 0; + } + } + if (i > size - 1) + i = size - 1; // truncate extra chars + memcpy(str, pc, i); + str[i] = '\0'; + return i; +} + + +int profile_read_nbyte_hex( + const char *file, // [IN] initialization file path + const char *section, // [IN] section name in initialization file + const char *key, // [IN] keyword name in initialization file + unsigned char *bytes, + size_t size) // [IN] buffer size(bytes) +{ + char str[MAX_PROF_LINE]; + if (profile_read_string(file, section, key, str, MAX_PROF_LINE, "") < 0) + return 0; + + char *p = str; + uint8_t num; + size_t count = 0; + while (0 != *p) { + if (strncasecmp("0x", p, 2)) break; + p += 2; + num = 0; + while((*p >= '0' && *p <= '9') || + (*p >= 'a' && *p <= 'f') || + (*p >= 'A' && *p <= 'F')) { + if (*p >= 'a' && *p <= 'f') + num = num * 16 + (*p - 'a' + 10); + else if (*p >= 'A' && *p <= 'F') + num = num * 16 + (*p - 'A' + 10); + else + num = num * 16 + (*p - '0'); + p++; + } + bytes[count++] = num; + if (count == size) break; + while (' ' == *p || '\t' == *p || SEP_ITEM == *p) p++; + } + return count; +} + + +// +// Return: +// >= 0 : num of successfully converted network address. +// < 0 : error, +int profile_read_naddr( + const char *file, // [IN] initialization file path + const char *section, // [IN] section name in initialization file + const char *key, // [IN] keyword name in initialization file + addr4_t *addrs, // [OUT] returned string + size_t size) // [IN] buffer size(num of addr4_t) +{ + char str[MAX_PROF_LINE]; + if (profile_read_string(file, section, key, str, MAX_PROF_LINE, "") < 0) + return 0; + + char *s, *e; + char buf[20]; + in_addr_t ip; + e = str; + size_t count = 0; + while ('\0' != *e) { + s = e; + while((*e >= '0' && *e <= '9') || '.' == *e) e++; + strncpy(buf, s, e-s); + buf[e-s] = 0; + if (inet_pton(AF_INET, buf, &ip) <= 0) + break; + addrs[count].s_addr = ip; + + while (' ' == *e || '\t' == *e || SEP_IP_PORT == *e) e++; + s = e; + while(*e >= '0' && *e <= '9') e++; + strncpy(buf, s, e-s); + buf[e-s] = 0; + addrs[count].sin_port = htons(atoi(buf)); + if (++count == size) + break; + while (' ' == *e || '\t' == *e || SEP_ITEM == *e) e++; + } + return count; + +} + +int profile_read_naddrdev( + const char *file, // [IN] initialization file path + const char *section, // [IN] section name in initialization file + const char *key, // [IN] keyword name in initialization file + addr4dev_t *addrdevs, // [OUT] returned string + size_t size) // [IN] buffer size(num of addr4_t) +{ + char str[MAX_PROF_LINE]; + if (profile_read_string(file, section, key, str, MAX_PROF_LINE, "") < 0) + return 0; + + char *s, *e; + char buf[20]; + in_addr_t ip; + e = str; + size_t count = 0; + while ('\0' != *e) { + s = e; + while((*e >= '0' && *e <= '9') || '.' == *e) e++; + strncpy(buf, s, e-s); + buf[e-s] = 0; + if (inet_pton(AF_INET, buf, &ip) <= 0) + break; + addrdevs[count].s_addr = ip; + + while (' ' == *e || '\t' == *e || SEP_IP_PORT == *e) e++; + s = e; + while(*e >= '0' && *e <= '9') e++; + strncpy(buf, s, e-s); + buf[e-s] = 0; + addrdevs[count].sin_port = htons(atoi(buf)); + + while (' ' == *e || '\t' == *e || SEP_IP_PORT == *e) e++; + s = e; + while(!isspace(*e) && SEP_ITEM != *e) e++; + strncpy(buf, s, e-s); + buf[e-s] = 0; + strcpy(addrdevs[count].dev, buf); + + if (++count == size) + break; + while (' ' == *e || '\t' == *e || SEP_ITEM == *e) e++; + } + return count; + +} +int profile_read_nstring( + const char *file, // [IN] initialization file path + const char *section, // [IN] section name in initialization file + const char *key, // [IN] keyword name in initialization file + char *strings, // [OUT] returned string + size_t string_size, + size_t string_num) // [IN] buffer size(num of strigns) +{ + int count=0; + char str[MAX_PROF_LINE]; + if (profile_read_string(file, section, key, str, MAX_PROF_LINE, "") < 0) + return 0; + char* string_begin=str; + char* string_end=strchr(string_begin,','); + while(string_end!=NULL&&string_num>count) + { + memcpy(strings+count*string_size,string_begin,string_end-string_begin); + count++; + string_begin=string_end+1; + string_end=strchr(string_end+1,','); + } + memcpy(strings+count*string_size,string_begin,strlen(str)-(string_begin-str)); + count++; + return count; + +} + +// +// Return: +// >= 0 : num of successfully converted network address. +// < 0 : error, +int profile_read_nip( + const char *file, // [IN] initialization file path + const char *section, // [IN] section name in initialization file + const char *key, // [IN] keyword name in initialization file + in_addr_t *ips, // [OUT] returned string + size_t size)// [IN] buffer size(num of in_addr_t) + +{ + char str[MAX_PROF_LINE]; + if (profile_read_string(file, section, key, str, MAX_PROF_LINE, "") < 0) + return 0; + + char *s, *e; + char buf[20]; + in_addr_t ip; + e = str; + size_t count = 0; + while ('\0' != *e) { + s = e; + while((*e >= '0' && *e <= '9') || '.' == *e) e++; + strncpy(buf, s, e-s); + buf[e-s] = 0; + if (inet_pton(AF_INET, buf, &ip) <= 0) + break; + ips[count] = ip; + + if (++count == size) + break; + while (' ' == *e || '\t' == *e || SEP_ITEM == *e) e++; + } + return count; +} + +// +// Return: +// >= 0 : num of successfully converted network address. +// < 0 : error, +int profile_read_nport( + const char *file, // [IN] initialization file path + const char *section, // [IN] section name in initialization file + const char *key, // [IN] keyword name in initialization file + in_port_t *ports, // [OUT] + size_t size)// [IN] buffer size + +{ + char str[MAX_PROF_LINE]; + if (profile_read_string(file, section, key, str, MAX_PROF_LINE, "") < 0) + return 0; + + char *s, *e; + char buf[20]; + e = str; + size_t count = 0; + while ('\0' != *e) { + s = e; + while((*e >= '0' && *e <= '9') || '.' == *e) e++; + strncpy(buf, s, e-s); + buf[e-s] = 0; + ports[count] = htons(atoi(buf)); + + if (++count == size) + break; + while (' ' == *e || '\t' == *e || SEP_ITEM == *e) e++; + } + return count; +} diff --git a/src/tool/sendsurvey_k/common/loadprof.h b/src/tool/sendsurvey_k/common/loadprof.h new file mode 100644 index 0000000..bd6c332 --- /dev/null +++ b/src/tool/sendsurvey_k/common/loadprof.h @@ -0,0 +1,120 @@ +#ifndef SLIB_LOADPROF_H +#define SLIB_LOADPROF_H + +#include + +#define MAX_PROF_LINE 1024 /* MAX bytes in a single line */ +#define COMMENT_CHAR '#' /* comments line prefix */ +#define SECTION_PRE '[' /* section name prefix */ +#define SECTION_POST ']' /* section name postfix */ +#define VALUE_SET '=' /* set key value operator */ + +#define SEP_ITEM ',' +#define SEP_IP_PORT ':' + +typedef struct addr4 { + in_addr_t s_addr; + in_port_t sin_port; + in_port_t __align; +} addr4_t; + + +#define DEV_NAME_MAX 10 +typedef struct addr4dev { + in_addr_t s_addr; + in_port_t sin_port; + char dev[DEV_NAME_MAX]; +} addr4dev_t; + + + + + +// Read in specified integer value +// +// Return: +// >= 0 : success +// < 0 : error, val is set to default +int profile_read_int( + const char *file, // [IN] initialization file path + const char *section, // [IN] section name in initialization file + const char *key, // [IN] keyword name in initialization file + int *val, // [OUT] returned value + int dval); // [IN] default value + +// Read in specified unsigned integer value +// +// Return: +// >= 0 : success +// < 0 : error, val is set to default +int profile_read_uint( + const char *file, // [IN] initialization file path + const char *section, // [IN] section name in initialization file + const char *key, // [IN] keyword name in initialization file + unsigned int *val, // [OUT] returned value + unsigned int dval); // [IN] default value + +// Read in specified string value, +// if value string is too long to return, extra chars truncated. +// prefix/postfix space chars cutted, +// space chars: ' ', '\t' +// +// Return: +// >= 0 : length of val +// < 0 : error, str is set to default +int profile_read_string( + const char *file, // [IN] initialization file path + const char *section, // [IN] section name in initialization file + const char *key, // [IN] keyword name in initialization file + char *str, // [OUT] returned string + size_t size, // [IN] buffer size(bytes) + const char *dstr); // [IN] default string + + + +int profile_read_nbyte_hex( + const char *file, // [IN] initialization file path + const char *section, // [IN] section name in initialization file + const char *key, // [IN] keyword name in initialization file + unsigned char *bytes, + size_t size); // [IN] buffer size(bytes) + +int profile_read_naddr( + const char *file, // [IN] initialization file path + const char *section, // [IN] section name in initialization file + const char *key, // [IN] keyword name in initialization file + addr4_t *addrs, // [OUT] returned string + size_t size); // [IN] buffer size(num of addr4_t) + +int profile_read_naddrdev( + const char *file, // [IN] initialization file path + const char *section, // [IN] section name in initialization file + const char *key, // [IN] keyword name in initialization file + addr4dev_t *addrdevs, // [OUT] returned string + size_t size); // [IN] buffer size(num of addr4_t) + + +int profile_read_nip( + const char *file, // [IN] initialization file path + const char *section, // [IN] section name in initialization file + const char *key, // [IN] keyword name in initialization file + in_addr_t *ips, // [OUT] returned string + size_t size); // [IN] buffer size(num of in_addr_t) + +// Return: +// >= 0 : num of successfully converted network address. +// < 0 : error, +int profile_read_nport( + const char *file, // [IN] initialization file path + const char *section, // [IN] section name in initialization file + const char *key, // [IN] keyword name in initialization file + in_port_t *ports, // [OUT] + size_t size);// [IN] buffer size +int profile_read_nstring( + const char *file, // [IN] initialization file path + const char *section, // [IN] section name in initialization file + const char *key, // [IN] keyword name in initialization file + char *strings, // [OUT] returned string + size_t string_size, + size_t string_num); +#endif /* #ifndef SLIB_LOADPROF_H */ diff --git a/src/tool/sendsurvey_k/common/log.c b/src/tool/sendsurvey_k/common/log.c new file mode 100644 index 0000000..8400187 --- /dev/null +++ b/src/tool/sendsurvey_k/common/log.c @@ -0,0 +1,49 @@ +#include +#include +#include +#include +#include +#include +#include "log.h" + +FILE *log_init(const char *fname) +{ + FILE *fp = fopen(fname,"ab+"); + if (!fp) { + fprintf(stderr, "log init error: %s\n", strerror(errno)); + exit(0); + } + return fp; +} + +void log_clear(FILE *fp) +{ + if (fp) + fclose(fp); +} + +void write_local_log(FILE * fp,const char *fmt,...) +{ + if(!fp) return; + struct tm * now; + time_t currTime; + time(&currTime); + char strTime[32]; + now = localtime(&currTime); + + if(!fp) return ; + memset(strTime,0,sizeof(strTime)); + strftime(strTime,sizeof(strTime),"%Y-%m-%d %H:%M:%S",now); + fprintf(fp,"%s\t",strTime); + + va_list ap; + + va_start(ap,fmt); + vfprintf(fp,fmt,ap); + va_end(ap); + + fputc('\n',fp); + fflush(fp); + +}// end of WriteLocalLog + diff --git a/src/tool/sendsurvey_k/common/log.h b/src/tool/sendsurvey_k/common/log.h new file mode 100644 index 0000000..767f646 --- /dev/null +++ b/src/tool/sendsurvey_k/common/log.h @@ -0,0 +1,12 @@ +#ifndef _LOG_H_ +#define _LOG_H_ + +#include +#include +#include + +FILE *log_init(const char *fname); +void log_clear(FILE *fp); +void write_local_log(FILE * fp,const char *fmt,...); + +#endif /*_LOG_H_ */ diff --git a/src/tool/sendsurvey_k/common/output.c b/src/tool/sendsurvey_k/common/output.c new file mode 100644 index 0000000..c992a91 --- /dev/null +++ b/src/tool/sendsurvey_k/common/output.c @@ -0,0 +1,206 @@ +// output.c +// +// +// +// MODIFIED by +// CREATED BY Guo Le, 08/24/2010 +// use sendnto instead of sendto, zhengchao@iie.ac.cn 2012-05-30 +// add Unix-domain sokcet,zhengchao@iie.ac.cn 2012-06-04 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include //offsetof +#include "debug.h" + +#include "output.h" + +int output_udp_init() +{ + int sockfd = socket(AF_INET, SOCK_DGRAM, 0); + if (-1 == sockfd) { + DEBUG_PRINTF("udpout_init: socket %s\n", strerror(errno)); + return -1; + } + return sockfd; +} + + +void output_udp_clear(int sockfd) +{ + close(sockfd); +} + +// send udp packet +int output_udp_send(int sockfd, uint32_t addr, uint16_t port, uint8_t *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 + { + DEBUG_MESSAGE("udpout_send: loss data"); + return -1; + } + } + to_send_len-=already_sended_len; + } + return already_sended_len; +} + + +int output_udp_init_connect(uint32_t addr, uint16_t port, char *dev) +{ + int sockfd = socket(AF_INET, SOCK_DGRAM, 0); + if (-1 == sockfd) { + DEBUG_PRINTF("udpout_init_connect: socket %s\n", strerror(errno)); + return -1; + } + 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 */ + + if (-1 == connect(sockfd, (struct sockaddr*)&dst_addr, sizeof(dst_addr))) + { + DEBUG_PRINTF("udpout_init_connect: error in connect %s\n", strerror(errno)); + return -1; + } + + if (dev) { + struct ifreq interface; + strncpy(interface.ifr_ifrn.ifrn_name, dev, IFNAMSIZ); + if (setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, (char *)&interface, sizeof(interface)) < 0) { + DEBUG_PRINTF("SO_BINDTODEVICE failed %s\n", strerror(errno)); + return -1; + } + } + + return sockfd; +} + +void output_udp_clear_connect(int sockfd) +{ + close(sockfd); +} + +// send udp packet +int output_udp_send_connect(int sockfd, uint8_t *data, int datalen) +{ + int to_send_len=datalen; + int already_sended_len=0; + while(to_send_len>0) + { + already_sended_len= send(sockfd, data, datalen, 0); + if(already_sended_len==-1) + { + if((EAGAIN == errno)||( EINTR == errno )|| (EWOULDBLOCK==errno)) + { + continue; + } + else + { + printf("udpout_send_connect: loss data %s\n",strerror(errno)); + DEBUG_MESSAGE("udpout_send_connect: loss data"); + return -1; + } + } + to_send_len-=already_sended_len; + } + return already_sended_len; +} +int init_output_un_socket(const char* file_name) +{ + int sd=-1; + int len; + struct sockaddr_un un; + struct timeval send_timeout; + int send_buf_size=1024*1024*4; + if(strlen(file_name)+8>sizeof(un.sun_path)) + { + printf("Unix-domain socket file name too long.\n"); + return -1; + } + sd=socket(AF_UNIX,SOCK_DGRAM,0); + if(sd<0) + { + printf("Get Unix-domain socket error:%s\n",strerror(errno)); + return -1; + }/* + flags=fcntl(sd,F_GETFL); + flags|=O_NONBLOCK; + if(fcntl(sd,F_SETFL,flags)==-1) + { + printf("Set Unix-domain socket error:%s",strerror(errno)); + return -1; + }*/ + send_timeout.tv_sec=0; + send_timeout.tv_usec=100000; + memset(&un,0,sizeof(un)); + un.sun_family=AF_UNIX; + if(-1==setsockopt(sd,SOL_SOCKET,SO_SNDTIMEO,&send_timeout,sizeof(send_timeout))) + { + printf("Set Unix-domain socket error:%s\n",strerror(errno)); + return -1; + } + if(-1==setsockopt(sd,SOL_SOCKET,SO_SNDBUF,&send_buf_size,sizeof(send_buf_size))) + { + printf("Set Unix-domain socket error:%s\n",strerror(errno)); + return -1; + } + snprintf(un.sun_path,sizeof(un.sun_path),"%s",file_name); + len=offsetof(struct sockaddr_un,sun_path)+strlen(un.sun_path); + unlink(un.sun_path); + if(0>bind(sd,(struct sockaddr*)&un,len)) + { + printf("Bind Unix-domain socket error:%s\n",strerror(errno)); + return -1; + } + return sd; +} +int named_unix_domain_socket_send(int un_sd,struct sockaddr_un *dest_un,const char*data,int datalen) +{ + int to_send_len=datalen; + int already_sended_len=0; + int sock_addr_len=offsetof(struct sockaddr_un,sun_path)+strlen(dest_un->sun_path); + while(to_send_len>0) + { + already_sended_len= sendto(un_sd, data, datalen,0,(struct sockaddr*)dest_un, sock_addr_len); + if(already_sended_len==-1) + { + + //DEBUG_PRINTF("Unix-domain send data: loss data %s\n",strerror(errno)); + return -1; + + } + to_send_len-=already_sended_len; + } + return already_sended_len; +} diff --git a/src/tool/sendsurvey_k/common/output.h b/src/tool/sendsurvey_k/common/output.h new file mode 100644 index 0000000..2da9fc2 --- /dev/null +++ b/src/tool/sendsurvey_k/common/output.h @@ -0,0 +1,18 @@ +#ifndef _OUTPUT_H_ +#define _OUTPUT_H_ + +#include +#include +// send udp packet + +int output_udp_init(); +void output_udp_clear(int sockfd); +int output_udp_send(int sockfd, uint32_t addr, uint16_t port, uint8_t *data, int datalen); + + +int output_udp_init_connect(uint32_t addr, uint16_t port, char *dev); +void output_udp_clear_connect(int sockfd); +int output_udp_send_connect(int sockfd, uint8_t *data, int datalen); +int init_output_un_socket(const char* file_name); +int named_unix_domain_socket_send(int un_sd,struct sockaddr_un *dest_un,const char*data,int datalen); +#endif /* _OUTPUT_H_ */ diff --git a/src/tool/sendsurvey_k/common/un_server b/src/tool/sendsurvey_k/common/un_server new file mode 100644 index 0000000000000000000000000000000000000000..4bc61e43a85329f6cbd11878ff3793a7c7108793 GIT binary patch literal 12685 zcmeHNeQ;dWb-(YeKGv3GttE$;?{zJMoubuBv0Y&xU0Yswa%C+1F*S|L(@MLNHmr8l z-M6xw#6(m$na!e9Cc{jo(`gL(Xs4Y}PbV~#PZ^WQW=uz9VCqTI)(}Wm*t8B%P>F;3 zJNMnQ`}Rq4GLy-FxjXyLJ->U-x#xa=y!VB0*X_Ed2@bmWlpyX{RY*eiQ;3;sB&)D? z;T0jVPW*wW0#b>8NTv|AV@#)%X{KH!=K-ytxUK*_WJeU`?3l8LL@B>g2&t$|e^O_& zOoi}Efb_^$;gc+Aj~!9;R^>-G`=j)TCB5}ZZ@rRdI!T5Rm~#23Z1lfI*}Fy$fg?Ud zL|HFUSr@>&-?X9>f2EeBh=$7OM#%}ml=bd{o-ChA|8<1@Y)Qm>H*ai7M4J=wWOlT9 zw0(2)=8b_&D$pkVr(#nP@3?cHG|Ba`Ol3f6{8!L#L=Hl#!6EsmiZ{FPcNCs=;dzBq z-hLH#k~LtQ_8%lcgg*S8__q{(g9~3r!U%tczf=BSB`U;KE}Z45U7YeOmHZAD{)oc& zEP;nzINKMdIWUw;ni(sSwoFr?`TD4}Hj7NE@7|athO<^iWRqykd&N*}CBEzlO&1pjpTV`_7ZY3LQycX+sEuZp9~=;A(L6rNbwBPsP+?!yF}Rd_Yxs%Z!o z=Nz~iQW7sXaGFy%Ty)@-41&%%@UrpJ&?BWNU;1SS zNIJ9U<`LGtLp)XK?2P2!BA%*pc1rTE6Hiq*dtCBABA%LN_L$^5)Zaj|=E=k%1nCM1mM6G2I)pI#OcgiK`w%jj_BU6?>KO?JV(i!#{ zxi|Na;Mi>jG8EbEPprn2ZZ!Mod1B6EOzfYBktQS>H=i82&KRH4j9ld^@bjy_FQxL8 zRd(vZ*MCr{BdSq8pFVxE{(7;`7{6`W3&Y6Ay5b2c1Nl<>oFDc(b0<%4o&V|SlarI= zhjIUfW0anIW)uaO4$o0N82KZ_p@fpl9T^0bb}kwDXNY;{F(Y@%_yC0~Amb^oF+P_V zx$?QySSbpdK7yem7O5i4u0(r3Nj^MF4gDOoeqlF6a^bo0!*k+Lb73#Ie0!l8#K`^N zxe$!V%nDEas?5?fRE>%7n30=)GD!yU7lm&_sDC;AgCiBbK@2n;=&fQ)Tz z0)kR~d`d4BjXFlLXv8>+2FYCbl2n4h!slQizYlzNEPr^ea0cv=sY9PAe3kI_LV_|t z0S1c&`0$dm0OyzG!*e-VGkN(ueNr~T_=QmJ@C756J!jfp(c|Te7{#NonJVUK`z5%Xp2){Re_&xE3zolY?XY%10Re<|1oWmefqSN75 zq}$Wsvya1+F&#dq_=2JriB5+vNj87@Y#}54nK33F?*4$<=t!3&kI#VQ56^VwPITsG zr1wu^((}v(5D{qq%=XAqkN3|&<_l~svu#~uE zf=K;eZbZG$7BDE@#h@Oe%2K2&7i~J%l}j`gx+c~=SK$|3IjiYnSMKvobDg>Ojog7I zIGJcViz%jkYi_PWhX*w!^J_y={wtWHg0O(IZSK&`V`|NI^jrufCZMB#7^w$8R|7dkcj8lKyy2AHG zy`zrz4wQB){=f8w#0k*F(hmTpbt<}uzB}KmRlbCi?J*2bXUjAJ+lc=t@I0v4F;Veg z0}Lr)rn~ zR`er9S5$?h=yi$)6#bNl+Yzf0-Mm+~f5jNKRQ9!2X0 zg}>(xE4k9+(}>#gqZLB5BN|V}Et8hnsF}qgY}$*ksgC#m0*R#(O*+YoFC!;;YNt#r z7*+1bo=S%&3hWlz&fg&$>GD;kWpU*YOOM3TfxZRHuUdJ{wqR>paC2}Y{BG$>4dI%? z&f8n<$tE-Lfh76_*6Xy;yq?TpDsB0TFm4xw?hqrsqS{lYRHc-pY^6tvRC;J1;-|Q` zvcfd8h;80zTB0&IhGNR1d#fwGwJ5#E&bta?RGEoblH^W42DwUaGX$!nlr$(GW!|9> zr4*H4$xKDlDj2B9M9lukP&{!6mOa;g4VJ5a44mX5(P$cXDyej2AST8tzTwSel&q-u zW)edBTH%Ff88ebVRf&pky-fvJ>$SmQ=*N=-qT<_RP+#j4%g!T09xtcKJ0+^uqqN1G zvPqHDulHuqZnj54_j4`;4o9p(p|2qweXTB*QO_$HyI0guKhrMX6*ZssBjn6oiFQC7 zYH6=1JF(E}Z-kGYqlNqGGEt$eBo+PWU>&MoXbm=(sDry&BNfPV^x}P@<^l9!?eg7R z3&`9#SK41u=)%92IxF&Owyhtijm9z-IwcS?tRL;JrClXha!o&KNLD(eRJPYyDLI-< ziMH5=qIHo(Iu?l@l1Uh!GBL;{qPjO_GfTWxl?|PX3bx`i7>b%4nA%oKVvl)9Qg4w} zw9Qrw)%9lkh1NlOo}*K#I=Rc0rnlP?+v_qYMEHJLZBt2bwnw-BxkR2$+A5B=xTDH0 za2>7>EmIooJ!Hi)xWQy|HQ>3<+gRiAUX966ZxWsrH8r2Y%I-nbYey@tKy*vZEj68u7>4ztMn|Y3HIQzBKurM1AJ^IjZ>;TXT&Xo^p(^x<%A%$Y z&AN?c>t4sr}@ODsJs0?CvW3vAui*=$7y zL|`D94GcyygCY<;l!UTPt+btjbvZ*9`%+9XCeqTeM1&MnY&c<5Fi zl$;I&u|cyxjg5yn7=a0m+E{%(V|EXRqi#UJw@ix=Pb@q0i&(wu>NF=MTWypOX4=O5BTKm^WF zk`%`y>+!k8P8H%7L@*N;^Y76^;DqQ=`rWG6(|krz*5`9i2QaLWMSVW69VZZh&u2Eb zu>6051UehB|9l?Wq8#S>WB*x>>3-Qufk%7<0$H`#?&fn(B-+d7_g1=M$lsdPa zQu;Hjs3@0%r@s4L`p2q5Qu3H`XuqE$c3bIapdTm6(uk_viy7?){Qd6`4 zd_Tb7FHDkg1nvf`&*eIeG-v+&p7x2AQmxqEZLU;)w)1Z;eZHTWQu?E;s3_|(r9GB2 z|MrF+DcRm&E4bU+&Ho3)$QGABr1Wo9`dm)iTFHOrUq?h$5kr!)J{|L%!NrR6NOWT) z-`!|y1#MD%x@A8^iW?*0F{N)7HSLI7b~ykyMw0)f^m!g+Gj7={meBuGHF3Slii*1R zo0ibO=}KGS$G=8DxP-p{=;T(TS9+K>8ozQ;tT4^SVI3HrT<1z(~dyAEKoP+ zzUNFBx!UITxD;Hh^oQq8r@rq7n_I62N)y&h}WklZITJltm3iGN$I-jgdQgrx zV14OvLNe|VjaWAp!&l*Zw#D#|6~D`I8uN%N1kdB;_{Rm$&*k`P!Sil8t|kE|h`2|7 zP2~b5t_F=O$y3|~mnV3{wdH`~JmR_~@avbr{Y&6$7T`2~bWtnLRE5gYXdb8#zo7e& zvOxP^O)PB3Pe^=WJGM)FVLOH;UaDuF2lgo3Xy`$#v=;OtPJUi=`APFB;oa3C#7bc) z{~v$|`R{f0pQ94@iL+|I#g@J<@rC~XBXG)hN?k~^{0T%BtGAa(KwnsIKV1TU54ff; z?6M_|}lu zibq`Xc_sfnC4bD-?#}}ED;XzwX$kx_X{RLlAb1MzN_^qG_kS*V{?2kW9Bx3nyYG`W zOWd|e&vh!gL&>}Emj;2a#A$@*)e0ql5V&uVdVauVUw+X7oxdhK`U>H5&Ch=)@diO3 zhdIM{rJY(qpPy0SdVaxWpZ!1U!f9MlcptbA^TVwTJ(A~#j`f-FZWmq++}TeaQ3}^C zfw#JF_NPPHcjvo9%GVZerTLz2m&6xYANwMSgyU0G(U-O|R<^$%?}tpYWACorW>@E) zz4$`aG`E*=J35LQo z^c}HFSKbyb_&T^;NS0}-H#h3L1Lodl1Q_ z%)v-9nutMOc0TS1^227TB63sSyvHoJcKNr`?o`}ua`&J{ +#include +#include +#include +#include +#include +#include +/* + memset(&(g_pproc->un_backend_addr),0,sizeof(g_pproc->un_backend_addr)); + strcpy(g_pproc->un_backend_addr[i].sun_path,back_end_file_name); + g_pproc->un_backend_addr[i].sun_family=AF_UNIX; + +*/ +int init_named_unix_domain_socket(const char* file_name) +{ + int sd=-1; + int len; + struct sockaddr_un un; + if(strlen(file_name)+8>sizeof(un.sun_path)) + { + printf("Unix-domain socket file name too long.\n"); + return -1; + } + sd=socket(AF_UNIX,SOCK_DGRAM,0); + if(sd<0) + { + printf("Get Unix-domain socket error:%s\n",strerror(errno)); + return -1; + } + + memset(&un,0,sizeof(un)); + un.sun_family=AF_UNIX; + + snprintf(un.sun_path,sizeof(un.sun_path),"%s",file_name); + len=offsetof(struct sockaddr_un,sun_path)+strlen(un.sun_path); + unlink(un.sun_path); + if(0>bind(sd,(struct sockaddr*)&un,len)) + { + printf("Bind Unix-domain socket error:%s\n",strerror(errno)); + return -1; + } + return sd; +} +int named_unix_domain_socket_send(int un_sd,struct sockaddr_un *dest_un,const char*data,int datalen) +{ + int to_send_len=datalen; + int already_sended_len=0; + int sock_addr_len=offsetof(struct sockaddr_un,sun_path)+strlen(dest_un->sun_path); + while(to_send_len>0) + { + already_sended_len= sendto(un_sd, data, datalen,0,(struct sockaddr*)dest_un, sock_addr_len); + if(already_sended_len==-1) + { + + printf("Unix-domain send data: loss data %s\n",strerror(errno)); + return -1; + + } + to_send_len-=already_sended_len; + } + return already_sended_len; +} +int main() +{ + int sd=-1; + char buf[2048]; + int recv_len=0; + struct sockaddr_storage sa; + socklen_t sa_len; + char* recv_file_name="/home/zhengchao/recv_preproc"; + unsigned long long stat_recv_bytes=0,stat_recv_pkts=0; + unsigned long long mult_tmp=0; + int i=0; + sd=init_named_unix_domain_socket(recv_file_name); + while(1) + { + recv_len=recvfrom(sd,buf,sizeof(buf),0,(struct sockaddr*)&sa,&sa_len); + stat_recv_bytes+=recv_len; + stat_recv_pkts++; + for(i=1;i`xY zEK&j{OjOkn2m1e6EswO!Vpzi~)9E9GJj`Rp3G=rr3>olhY3reZUv5GtrJ>D~6#w5o zkE<)$DqU;Vf4qFp+27fFpMCau-gB?+{hpR}x~4G|bao9R>UgP}L*mNV(JMJAu|{Sv zH@k$@vSJ{1{JVJ$#UiERVX0chhUBv$E~2z90o^SUGM*zSreb9w#Z+E4xMfnrWwQmT zV#Zt?AUU$tDf6AP+c>V`7o;6Wl|539NRn%ma*a|>#d}FHf{IoBsBZK>N9voSyFn4{ zrieB1Yc}S-0M`0pB0%YrHG<(}jhiP_92PKBv68zHa%AV<8kC*&;ZXak74_l3l5i-J z>|fH~xN6C&6?O4w-7;>!6AGz{*KOFyRV#l~fugc!;Gf!(@`rD~vBv#O+t(A%{z5xg zv~vDOzdrU;;wRTB|MP@wb;7UsB(0hl)a39EASx?AJPlwf{L=#XsseZ`a2Njb!*l?y zd=T`v@IO_#TMFR6DS!_Zz<*Ex-%|j;uK@n@0{Bl0;A;!u&lkW$1@MIh@aqfUy#?@x z3gB-Rz^^KRKU)C*_X7AK;M3WKYYW9iSAg?AE3d}zdy59*hJMQPvTSM1ma&PJ*?oCmQj^6aHAj z=VQ>`L3&rQc(h}45KM_!NAFe^><=N`8w*7eorFaQ>`f-(EE&Oo-Aq_G7-2oZo;al1 zLy-Wbi3>F8iuRJS01PAEL^K%=Gk+o)Vx3v7$c)Bd5?LWl>hXsnEFO_O*R?cXyVkd? zZdu(*xI^cEH0o7aAPT40hCeGUr$G#V`olboe;59f7lo$L4DvbB6e!n+nDQxzeBI0+ zozuo~n(M6VfNC$oYNA+oEV#phyDfN`1@~I;atq#S!7D8Itron}g11?4)fSZ9ZNX`d zRH4^`Tj$4q3tp|55pTEPw1%j#(}K@bAmUvXe3k{@W5F-5;Cn5&TuOQFa~AwU3;#X~ zevt+D4xBbJ@1W;o+R;riAH&z)fj5meCRYAqwTn$Gd;!7 z-1u=$e}`!5YU9J4-c2-hvGIMJ{wC4XwZ`{y`az|h`f+pW?Yq3G54-~>&$QmsJTkm}rki<3 zUfac^k*}1wS>|O3oZYpH+SZ%4zdhZ>ygP;y`owYGw7aZfqc`>8&BVC<>OClsC9i*V z5w?I3+YQqDz$q6|uYG3o4xG}wSB%DMJ1gfkF?5n)&6~3KfN5gJzi_6s-A5uH5!0G4EaZ`sjeKs-SP5r19(Eulk6LUqPBr)Si|17wE1|+#P<6(>i@8FZi!OVdJ z+o`UpUwcz;|H1qGi06ch=)oPt04qmTa$wj1IVQ;iv zBH`AjqqRJvBkrOa;z~m_^@caSgRDd=IlXCifaFaj_rOGN%9drR0Sjp#<=QunrLIM{ zQSvUC`6@C~uao*zYgsmXk<5O=%--4RJn|5^q6&jM$*4fuin&qnZHA!og-XWWBb3064KwM zHcGu~med4NHc|4Qq!1a&JV^M@7nAH@k#48< zLDxK0@_^?ArE|(?B!5-@*zK%5OucX{?S<sCmyvgz763tFi@)5dZ z7Lnzi^8?$?Pb3>Nmy(vo%sVK`o4)$-3K#4ceq|mQ51fHfhuH;gp*YhE&JoXPniWqK zV_2Y3QM_4>Gqvq}dfWNTG-xtGcWT@FspKd|?oo`~H#<`sPjrrW#&lNs6VHjxl;;Dg zm*=E+5N@CzKZ0@@OMBi-dCrY^&J!`d0~hb$`myxJ^J&ky#mBuJ$Gz#~(e$?W*Sta# zadYbEE5w+286~TVtzQqBiY6~Mlf@kOcy0?%eYK@eP#xw8#9Mc zDkhmDXH0WH`y+Q@*nw^{U{=*V>e-IDD?5Q_e)%cQ%%1I(H%JocZRghPr_Om`CN84WEP{UOrb{wUAq5kz zlP2sjP1pfFmden)0EOfzt`PGbJ3xCxq3}I$3x(^2!ao9_I%O5E$W=(U|K9W@yMhS@L0TQtqD<`}^w%ZCHzpV8F%6Id})p0nsqupPDH zGi%ml&rxOXwxg4cJ#`IPn8sv_C2|=r$9{X(OKFsP)9D zDw>)-X9u>OW%nN>Lp{gSp5wHQ0-k9} zC2G&Kr0%Od=S^*@Mejb{*s}P;HL1Ter~c@D?Ju@wtohgf0p8m2abnKWU(kI?OX|-p zsXsQQ{%g&|jQ70*Z(xslD)w7%dQ&Zy*l?}0B^{`(X+g@>l1|hvYDwQ$+kkCpqq0wI z@We)WtjL9Z?YW7>g|E`FsodwDGO%w>WB-eu`g^&f6?^N<5wsKEQq#RREwR}Uir^H( zB@Q0y>XQ*)qNi7$eF$_u>-ER{J+4TyXSHi#K;0Afh61Y>hLe}M;=x#7s3W*~Vc;?s zPF6ZYUCm9a7a}7Z>)u0;!fkwR^@?Mk{c zr<>d3pG-_Vg!m2&lfOso#AI_4aX;cBOyGlvYZ3Qh(r-fiGps!U#J@rO5aJiHD*rv= zPq62E6EW@UPa=K+@p;5Epo@Zb?@dhWcWSfCN{n5==K!PsCX}BhhBXz=hxN7P#rnhG zV0ezoJZB>lEL{bwuO;uJ#3lMn)xP5L)gx*4r7rhZBz zQ2r+T--G;d0;Z6^5Af|yH@g+}nJWJYz(1H?SpPxfk0Ado#8b(?4|u4`%{>Zv2-0;bLEfd!Xb|{Sh1PP;RY& z`^`XeHU$L;DoZPzTtFc|_6eBxHA=dsxj9nKuZ-P_TL%iCem)VUxJ`HCnmx;0WEZr0 zma|hAw3@(5Wr1{XL!m}QqD^I*B05;2FgB-+$I2&enNaQ=dyH7s4)aQX73u0=Ot&iDEg0$;Lx@szyF8kRS#%;#N^$Gfy{ zDfBj6-mo;67x|KYFP9)G z^pngF(Ea^^fDcbKd@CDPvPNM1Q3VOm{Gl^qTUEx`rO+={dmk1rzM`{GF4hqa`eW?b zT#%MVb~E~Sp0HXj*+gz0S7K&1VW3(Bt?MlN7v%AUT`}PKk9gV>b}&XOWx$ujI_eYa zsLb?ngQ$LIP&46GL+b{uox79ETu}u1wdA zUs9x(Jj$u!UvtX76HYENVgmaJk$oKy{f)Z_F-i^~DyH1;;=g1GUBLc5#9YSi0kdss zD`@+Zlw9_8O8$_NE3TyE^SIa=Nzh&nv}i6dOxuJ@#6C|4Qo0)#yX)V9u+rx#J)dA* z6kCNPFLpDVwis!nIJ6c~=?}qOeD^??@qAr;f!#-*nC z(Emo{z_yYVA5L@Gw@LQM3S5oSuMqn%$(EHyDgD}3q@9jlKlooK(dn%CSwR1QBsZ#< z*?&chZ*IV~OshbicCkjb>Rd$xd*D0q8@wR-B`Zi^)y;&@C06(4k#S zuGEKGEAHeJd0ij!R?yO;IGZYa6EUW_gqAjElJe#YEn!$uOLPObLY1!iiuS~DSW!W1 zy4FBu+J^p5U&XVWq#WDOaG&!+A}@bekXxMJ2bFp_n45-CGFgX>lt z<5N)PWA<~c#WeRt)08I095(*--O-+4{k`46NLNR zeDP#Fh#Q7LoWSo8Xg9#tf%!8=(4jU|qu8K6RwQarT=FUAm$LvyOY00@XV~8rXO431 zcU15KX84+K@X-@+AN4jzl|~Bm1x6O9snby{ac359_v10RV}{JA;TcPGkkC*9-TYpYhUL`H~fejp-7ZD7Dz|-O4lx9 zj!PtzFnrN4mbK1KdW`Q_tkEl3`htF_OUAIcgp)ncxkP(`T71EF&G7Xl{O#eODN(1< zY-wBYAhLKjq-n)buiXhFYzqc};-!Sm%&}bS;mA%Ps-Z-Jd6^L5cvj>1NtrJa>_^^y(EzN>7w1)f zMY!K6^Yup2K!-#hc0zXrbQBvAC@&{pP$?DjaUqnRP?Qf?(Q4-S31}Kzef}_WPFq)& z=);=a!KPie2vQgq1khMx)4Yuwff_!7`6XvMz^swYkpn#L_jUSvLgB5bV$ob`VaF1z z&$Kn5p~{@ayUR=-R{YopFo#M7MrRJJ_;F&_7wD|~Y9!41l*3`5L!CYTURGnjrwlKK zh_^eKJx22wDItt{wLLBnql`wRj~8rDkTLoKXIUtA53?uv%Cn%VEYRa;_C7&Xm-S-K zWA-hAoWUyp4P`p*4>?1fv51d0HO#()FjoExt96yE@^x(aYVgbvoJm>YH$O$?1Q5Wx zF;snfI*YZ(qW*wDzm-KJ!9$DdG5a0c&Ti|pIW zkn-U_!t4)I>rfj=2nGKyauFQP^dve*BRYh>lslHlrK^Zu#@mGG<;#d(@jA-TLlJay zyh)T`woS#jcO!rtK)}vf033JYB0*MU`({~Oc-)r0oY)tDbK2f7i$g?o zPG=7Vk~kWmJZ3X#f2)7L(yz);9FR`>Rf& zmuYp>zStyIEv3xmLUDK1ETUE@Gm8!Ci!ttD8^}!C z&=dDdJ2#M>wxK=u&k6+ln6`m-1-7AG_X`KN%EE=28>N{STrKtfgN$p?p@Xqbe@BpM z?KCmihW6giST)^GS#8a|+tMPMGLR0IC^VpS;oTlp?U{7rWmS@MSEeO+g_S%VKvAH> zB%voR^lXyt5T|y4r$sZ!%ogGIq+peP?=uac`#WvwTR-hvym(bCoo`V%isEO{#z9P> zTAFrdwxOfnsEG%dHYm%fp?CkZM`SrQ7(v>jG{$U0XTXSgoo@=U^<~;FTGebrV-lww z6K!gl#wR=5(EHzDGv}4T%)fpgsvY9yDl^q~dGRI_)cELg^)C&DCUxyOhMr?Ixd&o>>7> z7ENU3ikw_0NK5W?ZV^@qs-v^GifU@0rp9d4Mn@&20lb!E>ou^xs1~?L+Nr|W>8N^_ zRBKwbsuSudt6*=gZiFqoUR+FPDl;bKd0HU~^S#I3! z)gcECk_L14pq;96>sxK*x};2T&B*oH%v>(%Y-pR6>*@;}@E6_u*W^0+!Yuifva8Tp z*=hXij2@e7+GiEzxbh!KKvb(w#$)xNNJlss2-e59#+en!A?n*hcvF|Z@EcFY`hr`< zbEm}C-eA10n{MFIaWU~Bjq#%vLQohV$%x=s^EG||)Q&q706a|7)lq`&V$FDI=veZh zzJXV7d-^uxwyPVA0pm+g?=^;!FMebU3_bmlerdJws_~vNdaTQs|2<ftB)CP-G)x5Y45=po$>qpzgFMe>S5y*!hbHv>uhyN{UjFCX?WqdzN@379=|&9 zty-}p77TRz6XKT$_57Y*`B@#R2?v^9gV7=K(#KJUEqifbnX$WTpzFh~O#5si6jA ze*e>YboDa z^>y0HI)`+fWhX=zua@yb`qlFMRssEL{p8P%rqHhztY`A%bMMBm4>OOJ#W_(=Fz$~>I}`Pt zF@KjY7LT{r<7sBNo)%XzrhS_+R&iv2j)wJ?@8o)X)Yr@bO>3Y!r;^9?g^u2*I6>N? z?$c?{&kufj{9U0AmbED!&%I!(%VdIvM!bP4U=b!q0$dzF{et?T@;0>>{5AMCeIc_rSHySPL)24 zxww!nmB(MVWJ$0$Gcfw zU~2^WM2rJxp3{fpR{CX?mGB`i77Y7IK&E=b306lpT&ylZ$Afj9Adna3_tJI2ZXf1z z9G7?FfXSp-T}L8{)7(1zT8pB)JCF&TIGpQ1fl;WzrH<nB zx0WJZ_%WCydz0;SM`hBXNM}^#`PgOQdmM{of$F^tlA%C4tbv}b(mNAMUcD!=jPE@0J21(t z>{om$-i&;D2Sd^7J&ax{@0RjJ5|6T9!t7oo$frtvU$L8K?UV8ioSN)ERsV;OZ9$p?rJIQq|RXpN=`xFLBcAp-t)PYezAmrV~3oe%2(iCBuHNQzk8M& z6cfLALVT~v;Aqx=l4Q>zVU<_E7gxU{SK9`~pI`ou^Wyi3Zv{zmzq<;l~}r6@E=`TX+o>36_OeNWl1 z-WyWC``;_;ullEwSM_=yvR3;?<$G77a^h6{VBCQ!-uTVuy}W>Y4K0ia|Mms)v|r2DNphLxbjAFcmzm#wtp()SN+Eys7nFZT0r{&h z7xHaiAWyd$c_wnfC$A9l`$S}3^LeKuNA+Ek35oTq1=W`)kVo>e^GxJ|J3T`Fj9f>) z46+gb%71EHQ1(>i_unAoAI}?b`Q;0)sjoJ&PIphrq+i(2nG(0LtER+@%=b;L%52yb z?VOUo7>_L7R#u+2VW+0{C)P|GyrT9Ux%f1u_7k~yDO3A|T-;%<|G9V>)^oQN;%OTz zH@{b7&9q_FRqJprUWs+pZH0K+hE+&HK4{_Inn&_(fLIOxtq4pkTu2-*Pd^LOf+- za*>#X%gJ{VE+^GVxGN74q>arlfPbj~zF-ng;|(uJu=AzvoIIL0irDWbazGGNQw?8w zQTrH`e<{Z&w=c~J8ctdB+n1&fD%a(3Bb5zzAgSRyBS+`9aZt?%cT4=Z#MM0051jPu z%F|QG{)f1pDpr%%--b9oof)&;NM*y*NKR${^T4_NdE@0Z;8XdH_F+@u?{WQ;`|ZcT z>5DpLd3JtY0G|#=X;X}si-5aumyqB87Xq*1x^gd96u{}Vrz-fFz8XM5tqJt*ZmyR zA^%){HpeZ7$mD9tubxb$CBCiz|Lq0vnADShUcU?Ybe5gB)pGiD0X_c=+&M*m7%ss7 z9~>{A^c>{F0{ou=pRQN3-n?;PU=uK1uV(a-2y2)Locu|jp`eiBSH>1{ToRV(@&b5E z0lZD>&woyHPXYcN1@LEpJ24*~l=F`=>E#0auNA=mL+TmL)AREJ{Qp$|x1*uSZ~4!6 zW&@wD`5s3P_!qIkr*vHQ- zeg0%WzBAR+8xAIdfx1=8S6t30!xswl6Lkd>$DV;?PtR6Wj%Py?FJ|3MYu0;wilSmv zI$H`qAmydxJWVoRuJ&Ema>KQ2T6{OGTX(bP7T+yvu5Iy975KX^{#eYvmA`G61MqKP zF<;Yd8`i9EUdtb}$k!Cb*QeZW>*uG$m#%U#`Q@sPcoOg0;+$7~wv1M;(Cxe9#zbyMjz`AxE14oj8Dm86CLurrqndg4)Ew?7gH z2UYJ@J&k{XjM|aQ(|5{pWo6^!g5rZ`xtPTi@gkpi6Cjr<|9fruxj5ce)kTNN%|+et zm9<=q_ibd*SK4xO0P;_-<)Xa5DND^C1ECqu!(3cMjw02MSMa2SVDf;EjLdU QBYVI3gC+j!DdFz_2Xuv87ytkO literal 0 HcmV?d00001 diff --git a/src/tool/sendsurvey_k/sendsurvey.c b/src/tool/sendsurvey_k/sendsurvey.c new file mode 100644 index 0000000..352a62c --- /dev/null +++ b/src/tool/sendsurvey_k/sendsurvey.c @@ -0,0 +1,94 @@ + +#include +#include +#include +#include +#include +#include +#include + +#include "./common/output.h" +#include "AV_sendback.h" + + +#define BUF_SIZE 1024 +#define OPT_IMG_FP 0x10 +#define OPT_IMG_LEN 0x14 + + +struct image_fp_t +{ + unsigned int offset; + unsigned char fingerprint[128]; +}; +/*********************************************** +*Function: Add option to buf,return actual add size +*Note:This function is used for 505 sendback option create. +*Author:zhengchao@iie.ac.cn +*Date:2012-11-03 +***********************************************/ +int add_opt_505(char *buf,unsigned int buf_len, unsigned char opt_type,const char*opt_cont,unsigned int opt_cont_len) +{ + char *ptr; + unsigned int this_opt_len=sizeof(opt_type)+sizeof(unsigned int)+opt_cont_len; + if(buf==NULL||buf_len<=0) + return 0; + if(this_opt_len>buf_len) + { + return 0; + } + ptr=buf; + *(unsigned int *)ptr = opt_cont_len+sizeof(opt_type)+sizeof(opt_cont_len); + ptr += sizeof(unsigned int); + *(unsigned char *)ptr = opt_type; + ptr += sizeof(unsigned char); + memcpy(ptr, opt_cont, opt_cont_len); + return this_opt_len; +} +int main (int argc, char *argv[]) +{ + if(argc!=6 && argc!=7) + { + printf("input error\n"); + return 0; + } + char buf_survey[BUF_SIZE] = {0}; + int w_offset=sizeof(msg_head_t)+sizeof(msg_result_t); + msg_head_t *mh_survey = (msg_head_t*)buf_survey; + msg_result_t *msi_survey = (msg_result_t *)(buf_survey + sizeof(msg_head_t)); + struct sockaddr_un un_backend_addr; + memset(buf_survey, 0, BUF_SIZE); + mh_survey->magic = AV_MAGIC_VALUE; + mh_survey->m_type = AV_TYPE_RESULT; + mh_survey->c_len = sizeof(msg_result_t); + + *((uint64_t *)msi_survey->pid) = strtoull(argv[2], NULL, 0); + msi_survey->servicetype = atoi(argv[3]); + msi_survey->cfgid = atoi(argv[4]); + msi_survey->level = atoi(argv[5]); + + int fd_survey = init_output_un_socket("./un_tmp"); + if (fd_survey < 0) { + printf("socket error!"); + exit(1); + } + + memset(&(un_backend_addr),0,sizeof(un_backend_addr)); + strcpy(un_backend_addr.sun_path,argv[1]); + un_backend_addr.sun_family=AF_UNIX; + printf("param num: %d\n", argc); + if(argc==7) + { + w_offset += 1024-strlen(argv[6]) + sprintf(buf_survey + w_offset, argv[6]); + } + else + { + w_offset += 1024; + } + printf("pid:%lu, service:%d, configID:%u, level:%d, logindex:%s\n", *((uint64_t *)msi_survey->pid), msi_survey->servicetype, msi_survey->cfgid, msi_survey->level, argv[6]); + mh_survey->c_len = w_offset-sizeof(msg_head_t); + named_unix_domain_socket_send(fd_survey,&un_backend_addr, buf_survey, w_offset); + + return 0; +} +