LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 934|回复: 0

急问!!如何编写用UDP发送数据包程序!!!

[复制链接]
发表于 2006-7-18 08:52:07 | 显示全部楼层 |阅读模式
//        这是个大概框架,谁能给个完整的代码,谢拉
//        数据包 = 包头  +  包体。
//        数据包各字段均为固定长度,之间没有分隔符区分,各字段右对齐,左补空格。

#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);
}

这是个大概框架,谁能给个完整的代码,谢拉
注意:数据包各字段均为固定长度,之间没有分隔符区分,各字段右对齐,左补空格。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表