⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sendping.c

📁 一个通过UDP协议发送消息包的程序例子
💻 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 + -