当前位置: 首页 > news >正文

南阳网站建设网络系统架构

南阳网站建设,网络系统架构,茂名企业自助建站,北京建站公司哪家好相信很多人都使用过飞鸽传书#xff0c;这个小工具在局域网传输数据高效而便捷#xff0c;自己在大二的时候就想看看飞鸽传书的源码#xff0c;但那时候自己的水平有限#xff0c;这几天有机会重写飞鸽传书#xff0c;也对IPMSG的网络协议做了深入的研究#xff0c;这里也…相信很多人都使用过飞鸽传书这个小工具在局域网传输数据高效而便捷自己在大二的时候就想看看飞鸽传书的源码但那时候自己的水平有限这几天有机会重写飞鸽传书也对IPMSG的网络协议做了深入的研究这里也要感谢IPMSG的作者公开源代码。 首先需要明确IPMSG的主要功能IPMSG可以局域网通信、传输文件、传输文件夹可以通过添加局域网外IP来实现网外的聊天与文件传输功能。我们先分析下IPMSG的聊天功能IPMSG通过UDP协议实现聊天当一个IPMSG的客户端运行开始首先它向整个局域网广播上线报文局域网内的其他IPMSG客户端收到上线报文后回复该报文回复报文中包含了该客户端的IP PORT 用户名 机器名。这样在上线客户端通过广播发送上线报文后局域网内的其他所有IPMSG客户端都发送一个回复报文这样所有IPMSG的客户端都更新自己的在线用户列表。这样IPMSG的上线就算结束了接下来如果有客户端发送消息而消息是通过UDP来完成的客户端通过查询自己用户链表获取其他用户的网络地址信息发送消息给其他用户。总结一下 ipmsg可以用于收发消息和文件夹 使用UDP协议收发消息使用TCP协议收发文件夹 默认使用2425端口做数据传输(TCP/UDP) 包含以下功能 用户上下线识别 消息收发 文件传输文件夹传输 IPMSG的报文格式版本号:包编号:发送者姓名:发送者主机名:命令字:附加信息 整个报文通过字符串的形式发送IPMSG的版本号为1而包编号必须是不重复的数字这里可以是用比较简洁的方式就是通过linux的库函数timer来完成time 函数返回从1970 年1 月1 日0 点以来的秒数.所以每个运行timer()的结果都是不一样的可以放心使用。报文中的命令字是指明这个报文是消息、上线通告、传输文件、传输文件夹还是其他的东西附加信息在不同的命令字下是不一样的如果命令字是消息那么附加信息就是消息内容如果命令字是传输文件那么附加信息就是文件的信息了我们来看一下命令字这是IPMSG最为重要的内容。 /*    (#)Copyright (C) H.Shirouzu 1996-1998 ipmsg.h    Ver1.34 */#ifndef IPMSG_H#define IPMSG_H/* IP Messenger Communication Protocol version 1.0 define *//* macro */#define GET_MODE(command)    (command 0x000000ffUL)#define GET_OPT(command)    (command 0xffffff00UL)/* header */#define IPMSG_VERSION            0x0001#define IPMSG_DEFAULT_PORT        0x0979/* command */#define IPMSG_NOOPERATION        0x00000000UL#define IPMSG_BR_ENTRY            0x00000001UL#define IPMSG_BR_EXIT            0x00000002UL#define IPMSG_ANSENTRY            0x00000003UL#define IPMSG_BR_ABSENCE        0x00000004UL#define IPMSG_BR_ISGETLIST        0x00000010UL#define IPMSG_OKGETLIST            0x00000011UL#define IPMSG_GETLIST            0x00000012UL#define IPMSG_ANSLIST            0x00000013UL#define IPMSG_FILE_MTIME        0x00000014UL#define IPMSG_FILE_CREATETIME        0x00000016UL#define IPMSG_BR_ISGETLIST2        0x00000018UL#define IPMSG_SENDMSG            0x00000020UL#define IPMSG_RECVMSG            0x00000021UL#define IPMSG_READMSG            0x00000030UL#define IPMSG_DELMSG            0x00000031UL/* option for all command */#define IPMSG_ABSENCEOPT        0x00000100UL#define IPMSG_SERVEROPT            0x00000200UL#define IPMSG_DIALUPOPT            0x00010000UL#define IPMSG_FILEATTACHOPT        0x00200000UL/* file types for fileattach command */#define IPMSG_FILE_REGULAR        0x00000001UL#define IPMSG_FILE_DIR            0x00000002UL#define IPMSG_LISTGET_TIMER            0x0104#define IPMSG_LISTGETRETRY_TIMER    0x0105#define HS_TOOLS        HSTools#define IP_MSG            IPMsg#define NO_NAME            no_name#define URL_STR            ://#define MAILTO_STR        mailto:#endif         /* IPMSG_H */ 报文中的命令字是一个32位无符号整数包含命令最低字节和选项高三字节两部分常用基本命令带有BR标识的为广播命令下边是一些重要的命令字。IPMSG_NOOPERATION 不进行任何操作IPMSG_BR_ENTRY 用户上线IPMSG_BR_EXIT 用户退出IPMSG_ANSENTRY 通报在线IPMSG_SENDMSG 发送消息IPMSG_RECVMSG 通报收到消息IPMSG_GETFILEDATA 请求通过TCP传输文件IPMSG_RELEASEFILES 停止接收文件IPMSG_GETDIRFILES 请求传输文件夹在IPMSG上线时首先发送的是IPMSG_NOOPERATION默认是不做任何处理然后上线通告报文IPMSG_BR_ENTRY 。 用户列表通过链表来实现看看结构体 typedef struct use_date{    char use_name[USE_NAME_LEN];   //用户名  char host_name[HOST_NAME_LEN];  //机器名  int id;               //节点ID。  long int host_ip;     //存储IP信息避免重复添加  struct sockaddr_in inet;  //存储网络信息  struct use_data *next;}IPMSG_USE; 每次IPMSG在收到上线通告报文后都要查找相同ip的节点是否已经存在只要和结构体成员host_ip比较就可以了这样整个用户列表当中的成员是不会重复的。报文的发送主要依靠下边的函数实现这里推荐下边的这种写法特别是对与命令比较多的情况下使用下边的好处就在与结构非常的清晰。 mode 命令  msg 附加信息 struct sockaddr *p网络信息  fd网络套接字描述符  int msg_send(const int mode,const char *msg,const struct sockaddr *p,int fd){    int udp_fdfd;    int broadcast_en1;    char msg_buf[SND_BUF_LEN];    char *usetest,*groupsunplusapp;    socklen_t broadcast_lensizeof(broadcast_en);    long int msg_idtime((time_t *)NULL);    struct sockaddr_in udp_addr;    struct sockaddr client;    bzero(msg_buf,SND_BUF_LEN);    bzero(udp_addr,sizeof(struct sockaddr_in));    udp_addr.sin_familyAF_INET;    udp_addr.sin_porthtons(IPMSG_UDP_PORT);    inet_pton(AF_INET,BR_IP,udp_addr.sin_addr.s_addr); //下边的if 与else if 对于上线通告 下线等使用广播地址其他的则否    if( (pNULL)(mode!IPMSG_NOOPERATION)(mode!IPMSG_BR_ENTRY)(mode!IPMSG_BR_EXIT))    {        printf(p is NULL,only mode IPMSG_NOOPERATICNA IPMSG_BR_ENTRY IPMSG_EXIT is allowed pNULL /n);        return 1;    }    else if( (p!NULL)(mode!IPMSG_NOOPERATION)(mode!IPMSG_BR_ENTRY)(mode!IPMSG_BR_EXIT))        client*p; //打开广播    if( setsockopt(udp_fd,SOL_SOCKET,SO_BROADCAST,broadcast_en,broadcast_len)0 )    {        perror(setsockopt error);        exit(1);    }    switch (mode)    {        case IPMSG_NOOPERATION:        sprintf(msg_buf,1:%d:%s:%s:%d:%s,msg_id,use,group,mode,NULL);        sendto(udp_fd,msg_buf,strlen(msg_buf),0,(struct sockaddr *)udp_addr,sizeof(struct sockaddr));        break;        case IPMSG_BR_ENTRY:        sprintf(msg_buf,1:%d:%s:%s:%d:%s,msg_id,use,group,mode,msg);        sendto(udp_fd,msg_buf,strlen(msg_buf),0,(struct sockaddr *)udp_addr,sizeof(struct sockaddr));        break;        case IPMSG_BR_EXIT:        sprintf(msg_buf,1:%d:%s:%s:%d:%s,msg_id,use,group,mode,msg);        sendto(udp_fd,msg_buf,strlen(msg_buf),0,(struct sockaddr *)udp_addr,sizeof(struct sockaddr));        break;        case IPMSG_ANSENTRY:        sprintf(msg_buf,1:%d:%s:%s:%d:%s,msg_id,use,group,mode,msg);        sendto(udp_fd,msg_buf,strlen(msg_buf),0,client,sizeof(struct sockaddr));        break;        case IPMSG_SENDMSG:        sprintf(msg_buf,1:%d:%s:%s:%d:%s,msg_id,use,group,mode,msg);        sendto(udp_fd,msg_buf,strlen(msg_buf),0,client,sizeof(struct sockaddr));        break;        case IPMSG_SENDMSG_OPT:        sprintf(msg_buf,1:%d:%s:%s:%d:%s,msg_id,use,group,mode,msg);        sendto(udp_fd,msg_buf,strlen(msg_buf),0,client,sizeof(struct sockaddr));        break;        case IPMSG_RECVMSG:        sprintf(msg_buf,1:%d:%s:%s:%d:%s,msg_id,use,group,mode,msg);        sendto(udp_fd,msg_buf,strlen(msg_buf),0,client,sizeof(struct sockaddr));        break;        case IPMSG_GETFILEDATA:        sprintf(msg_buf,1:%d:%s:%s:%d:%s,msg_id,use,group,mode,msg);        sendto(udp_fd,msg_buf,strlen(msg_buf),0,client,sizeof(struct sockaddr));        break;        case IPMSG_RELEASEFILES:        sprintf(msg_buf,1:%d:%s:%s:%d:%s,msg_id,use,group,mode,msg);        sendto(udp_fd,msg_buf,strlen(msg_buf),0,client,sizeof(struct sockaddr));        break;        case IPMSG_GETDIRFILES:        sprintf(msg_buf,1:%d:%s:%s:%d:%s,msg_id,use,group,mode,msg);        sendto(udp_fd,msg_buf,strlen(msg_buf),0,client,sizeof(struct sockaddr));        break;        default:        printf(no match mode !/n);        break;    }    broadcast_en0; //  关掉广播    if( setsockopt(udp_fd,SOL_SOCKET,SO_BROADCAST,broadcast_en,broadcast_len)0 )    {        perror(setsockopt error);        exit(1);    }    printf(msg send ok ! /n);    return 0;}     通过上边的报文就可以实现消息的传递可以发起文件、文件夹的传输传输文件时首先需要通过UDP报文联络在UDP报文联络好之后随即发起TCP文件传输文件传输是不带格式的。IPMSG的一个难点就是文件夹的传输。今天就写这里而且也做到这里。
http://www.tj-hxxt.cn/news/218146.html

相关文章:

  • 物流公司做网站安徽网新科技有限公司官网
  • 查看邮箱注册的网站可视化域名网站模块被删了
  • 有几家做网站的公司wordpress主题检测
  • 网站备案审核通过后wordpress wp
  • 阜阳建设工程质量监督局网站wordpress个性主题
  • 南京市建设中心网站重庆长寿网站设计公司哪家好
  • 社交app定制开发南京seo收费
  • 怎么用家里的电脑做网站服务器安徽通皖建设工程有限公司网站
  • 优秀vi设计网站wordpress轮播图设置
  • wordpress站群主题wordpress编辑富文
  • 做网站域名服务器赚钱软件学生
  • 企业推广宣传文案谷歌seo关键词排名优化
  • 网站建设与管理的过程重庆网页制作
  • 做电商网站都需要学什么上海加盟网网站建设
  • 网站制作与网站建设实际报告吕梁网站建设kuyiso
  • 上海网站设计开发公司上海响应式网站建设
  • 怎么获取免费的网站域名个人网站模板王
  • 简洁风格的网站模板免费下载vps主机可以做几个网站
  • 网站建设哪家好知道万维科技厦门模板建站系统
  • wordpress如何在首页不显示某类分类目录下的文章?网站可以做多少优化关键词
  • 大型门户网站设计解决方案基层消防力量建设
  • 郑州门户网站建设建筑公司企业使命和愿景大全
  • 素米高端品牌网站建设系部 网站建设方案
  • 网站建设后期维护小魔仙贵阳网站建设服务公司
  • PHP手机网站开发工程师华宇网站建设
  • 咸阳北京网站建设域名备案查询最新消息
  • 中国优秀企业网站汕头网站快速优化排名
  • 网站名称和备案公司名称不一样做空调的网站
  • phpok企业建站系统网站建设公司词
  • 溧阳城乡建设厅网站做视频课程网站