|
|
// 这是个大概框架,谁能给个完整的代码,谢拉
// 数据包 = 包头 + 包体。
// 数据包各字段均为固定长度,之间没有分隔符区分,各字段右对齐,左补空格。
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 2345
#define SERVER_IP "127.0.0.1"
#define PACKET_SIZE 4096
// 包头定义
typedef struct {
unsigned char SoftType; // 软件类型,安全认证系统填写为130
char softName[20]; // 软件标识,安全认证系统填写为"E-Securer"
char MsgType[4]; // 消息类型,1为数据 2为告警 3为日志,对设备登录、退出登录的消息,在此处填写为3;对登录失败的消息,在此处填写为2
unsigned int DataLength; // 后续数据内容长度
} PduHead;
// 包体定义
#define MAX_STR_LEN 512 /* 字符串的最大长度 */
#define STR_LEN 61
#define IP_LEN 21
#define MaxEventNum 3f
// 传输的告警及日志的数据结构
typedef struct {
// 在网管系统中,标识创建者的类型,填写为130(安全认证系统)
char m_CreatorType;
// 创建者的名称,安全认证系统填写为"E-Securer"
char m_CreatorName[STR_LEN];
// 创建事件的时间,类型为10位长整型,例如:1141959600(2006-3-10 11:0:0)
unsigned int m_CreateTime;
// 事件源(网元)的名称,类型是字符串。如果不知道名称,可以IP替代。
char m_SourceName[STR_LEN];
// 事件源网元的IP地址,类型是字符串。
char m_SourceIP[IP_LEN];
// 事件的编号,填写为消息类型,如:
// 告警:m_ EventNo="2",表示登录失败的消息
// 日志:m_ EventNo="3",表示设备登录、退出登录的消息
char m_EventNo[STR_LEN];
// 告警的严重等级,类型为短整型(如果是数据,则填写为0)。例如:
// 1:正常日志;
// 2:提示告警,不影响业务的运行;
// 3:一般告警,当前业务运行异常,阈值告警;
// 4:严重告警,业务执行性能严重下降;
// 5:紧急告警。(系统瘫痪、业务不能执行。)
char m_Severity;
// 事件显示的标题,类型为字符串(即事件概要),(如果是数据,则填写为性能数据的名称)
char m_DisplayTitle[STR_LEN];
// 事件显示的详细内容(如果是数据,则填写为性能数据的值)
char m_DisplayString[MAX_STR_LEN];
} AlarmEvent;
int main(void)
{
// char sendpacket[PACKET_SIZE];
PduHead pdh; //包头结构体变量
AlarmEvent ae; //包体结构体变量
// 设置包头
bzero(&pdh, sizeof(PduHead));
pdh.SoftType = 130;
strcpy(pdh.softName, "E-Securer");
strcpy(pdh.MsgType, "1");
// 设置包体
bzero(&ae, sizeof(AlarmEvent));
ae.m_CreatorType = 130;
strcpy(ae.m_CreatorName, "E-Securer");
ae.m_CreateTime = (unsigned int)time(NULL);
strcpy(ae.m_SourceName, "CZ_7507_2");
strcpy(ae.m_SourceIP, "10.38.0.2");
strcpy(ae.m_EventNo, "3");
ae.m_Severity = (unsigned char)1;
strcpy(ae.m_DisplayTitle, "设备CZ_7507_2(10.38.0.2)安全认证日志");
strcpy(ae.m_DisplayString, "admin用户由10.33.147.23登录至设备CZ_7507_2(10.38.0.2)成功!");
............................
int sockfd, len;
struct sockaddr_in addr;
int addr_len = sizeof(struct sockaddr_in);
// 建立socket
if ((sockfd = socket(AF_INET,SOCK_DGRAM,0)) < 0)
{
perror("socket");
exit(1);
}
// 填写sockaddr_in
bzero(&addr, sizeof(addr));
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = inet_addr(SERVER_IP);
// 将数据包传送给server端
if (sendto(......) == -1)
{
perror("sendto");
exit(2);
}
close(sockfd);
exit(0);
}
这是个大概框架,谁能给个完整的代码,谢拉
注意:数据包各字段均为固定长度,之间没有分隔符区分,各字段右对齐,左补空格。 |
|