📄 sendping.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <strings.h>
#include <ctype.h>
#include <pthread.h>
#include <libgen.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <netdb.h>
#include <sys/ioctl.h>
#include <sys/param.h>
typedef struct _MsgHead {
u_char reserved0;
u_char socket_id;
u_char sid;
u_char snms_id;
u_char did;
u_char dnms_id;
u_char type;
u_char reserved1;
u_char len[4];
} MsgHead;
int send_alarm(char *ip,char *alarmstr,int len)
{
int sd = -1;
struct sockaddr_in sin;
int retcode;
int port=4003;
sd = socket(PF_INET, SOCK_DGRAM, 0);
if (sd < 0) {
printf("socket failed: %s\n", strerror(errno));
goto failed;
}
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr(ip);//要指定发送的IP
//sin.sin_addr.s_addr =htonl(INADDR_ANY);
sin.sin_port = htons(port);
retcode = sendto(sd, alarmstr, 14+len, 0, (struct sockaddr *)&sin, sizeof(sin));
if (retcode < 0) {
printf("sendto failed: %s\n", strerror(errno));
goto failed;
}
printf("向服务器[%s:%d]发消息[%s]长度[%d]\n",inet_ntoa(sin.sin_addr),port,alarmstr,retcode);
close(sd);
return 0;
failed:
if (sd >= 0) {
close(sd);
}
return -1;
}
void set_msg_body_len(void *p_msg, long len)
{
MsgHead *p_msg_head;
if(p_msg==NULL){
return;
}
p_msg_head=(MsgHead *)p_msg;
p_msg_head->len[0]=(u_char)(len/256/256/256);
p_msg_head->len[1]=(u_char)(len/256/256);
p_msg_head->len[2]=(u_char)(len/256);
p_msg_head->len[3]=(u_char)(len%256);
return;
}
void *create_msg(u_short sid, u_short snms_id, u_short did, u_short dnms_id,u_short type, u_long body_len, char *body,char *subType)
{
void *p_msg=NULL;
MsgHead *p_msg_head;
char *sp=0;
u_long msg_len;
msg_len = sizeof(MsgHead) +2+ body_len + 1;
p_msg=(u_char *)malloc(msg_len);
if(p_msg==NULL) {
return NULL;
}
memset(p_msg, 0, msg_len);
//产生12字节消息头
p_msg_head = (MsgHead *)p_msg;
p_msg_head->reserved0=(u_char)0;
p_msg_head->reserved1=(u_char)0;
p_msg_head->socket_id=(u_char)0;
p_msg_head->sid=(u_char)sid;
p_msg_head->did=(u_char)did;
p_msg_head->snms_id=(u_char)snms_id;
p_msg_head->dnms_id=(u_char)dnms_id;
p_msg_head->type=(u_char)type;
set_msg_body_len(p_msg,body_len+2);
//2字节消息类型
sp=p_msg+sizeof(MsgHead);
*sp=(u_char)102;
sp=p_msg+sizeof(MsgHead)+1;
*sp=(u_char)atoi(subType); //字节2(10:ping)
//拼接消息体
if(body_len&&body){
sp=p_msg+sizeof(MsgHead)+2;
memcpy(sp,body,body_len);
}
return p_msg;
}
/**********************************************************
gcc -g -c -I../include sendping.c
gcc -g -o sendtest -I../include sendping.o -lpthread
用ps -ef |grep test 只能看到test进程,是看不到线程的,线程会随
着进程终止而终止,创建两个线程
**********************************************************/
int main(int argc, char *argv[])
{
pthread_t id;
int i,ret;
char g_entry_facility[24][64];
char buf[512];
char *send_msg;
u_char *p_msg=NULL;
if (argc != 4)
{
printf("\n执行%s时所带参数错误 如: sendtest 192.168.0.201 0 \"MIBGroupCollectCfg|1\" \n",argv[0]);
return -1;
}
send_msg=(char *)create_msg(10, 1, 102, 1,1, strlen(argv[3]), argv[3], argv[2]);//argv[2]=10请求消息; =12终止消息
send_alarm(argv[1],send_msg, strlen(argv[3]) );
//strncpy(send_msg,p_msg,sizeof(send_msg)-1 );
//printf("This is the main process[%d].\n",sizeof(g_entry_facility)/sizeof(*g_entry_facility));
//send_alarm("F|192.168.0.200,192.168.0.201|0,2,3|0-7|11001|3");
//send_alarm("K|3|ICMP packet too large has been detected|3");
//send_alarm("<3>aaaaa消息aaICMP packet too large has been detected");
//sleep(1);
//printf("消息[%x]\n",send_msg);
//printf("消息[%x][%x][%c]\n",p_msg->reserved0,p_msg->reserved0,p_msg[12]);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -