精华内容
下载资源
问答
  • 飞鸽传书协议,客户端,服务器端程序 C++
  • XEIM 飞鸽传书传输协议/飞鸽传书服务端源码/飞鸽传书客户端源码<非原创 谢谢>
  • 自己想写个手机版的飞鸽,所以翻译了一下,即使不打算自己做个飞鸽,学习下人家的协议还是好的。 那段暂没翻译。
  • 飞鸽传书协议分析

    千次阅读 2009-02-18 21:52:00
    在每 30 秒一次的 ipmsg 飞鸽传书更新中向其它飞鸽传书器通告该指定网络。注: 如果您输入子网地址,SOFT 会自动将其转换到有类网络地址。例如,如果您输入命令 network 192.168.1.32,飞鸽传书器将把它转换为 ...

     

    在每 30 秒一次的 ipmsg 飞鸽传书更新中向其它飞鸽传书器通告该指定网络。
    注: 如果您输入子网地址,SOFT 会自动将其转换到有类网络地址。例如,如果您输入命令 network 192.168.1.32,飞鸽传书器将把它转换为 network 192.168.1.0。

    强大的故障排除命令
    要检验飞鸽传书和排除飞鸽传书故障,请首先使用 show ip ipmsg 和 protocols。如果使用这两条命令不能找出问题,那么请使用 debug ip ipmsg 命令查看详细情况。我们将按照检验飞鸽传书和排除飞鸽传书故障时这三条命令的建议使用顺序来分别讨论它们。请记住,在配置任何飞鸽传书(无论静态或动态)时,请使用 show ip interface brief 命令确保所有必需的接口都处于“up”和“up”状态。


    解读 show ip ipmsg 输出
    现在我们以 R1 获知的一条 ipmsg 飞鸽传书为例来解读飞鸽传书表中显示的输出。
    R 192.168.5.0/24 [120/2] via 192.168.2.2, 00:00:23, Serial0/0/0
    通过检查飞鸽传书列表中是否存在带 R 代码的飞鸽传书,我们可快速得知飞鸽传书器上是否确实运行着 ipmsg。如果没有配置 ipmsg,您将不会看到任何 ipmsg 飞鸽传书。
    紧跟在 R 代码后的是远程网络地址和子网掩码 (192.168.5.0/24)。
    AD 值(ipmsg 为 120)和到该网络的距离(2 跳)显示在括号中。
    此外,输出中还列出了通告飞鸽传书器的下一跳 IP 地址(地址为 192.168.2.2 的 R2)和自上次更新以来已经过了多少秒(本例中为 00:00:23)。
    最后列出的是飞鸽传书器用来向该远程网络转发数据的送出接口 (Serial 0/0/0)。

    解读 show ip protocols 输出
    如果飞鸽传书表中缺少某个网络,可以使用 show ip protocols 命令来检查飞鸽传书配置。show ip protocols 命令会显示飞鸽传书器当前配置的飞鸽传书协议。其输出可用于检验大多数 ipmsg 参数,从而确认:
    .是否已配置 ipmsg 飞鸽传书
    .发送和接收 ipmsg 更新的接口是否正确
    .飞鸽传书器通告的网络是否正确
    .ipmsg 邻居是否发送了更新
    此命令对于检验其它飞鸽传书协议的工作情况也非常有用

    解读 debug ip ipmsg 输出
    大多数 ipmsg 配置错误都涉及 network 语句配置错误、缺少 network 语句配置,或在有类环境中配置了不连续的子网。对于这种情况,可使用一个很有效的命令 debug ip ipmsg 找出 ipmsg 更新中存在的问题,如图所示。该命令将在发送和接收 ipmsg 飞鸽传书更新时显示这些更新信息。因为更新是定期发送的,所以您需要等到下一轮更新开始才能看到命令输出

    不必要的 ipmsg 更新会影响网络性能

    在 LAN 上发送不需要的更新会在以下三个方面对网络造成影响:
    1. 带宽浪费在传输不必要的更新上。因为 ipmsg 更新是广播,所以交换机将向所有端口转发更新。
    2. LAN 上的所有设备都必须逐层处理更新,直到传输层后接收设备才会丢弃更新。
    3. 在广播网络上通告更新会带来严重的风险。ipmsg 更新可能会被数据包嗅探软件中途截取。飞鸽传书更新可能会被修改并重新发回该飞鸽传书器,从而导致飞鸽传书表根据错误度量误导流量。

    网络中的飞鸽传书

    网络中的飞鸽传书

    企业需巧用飞鸽传书

    飞鸽传书何时能互通

    飞鸽传书测试环境

    飞鸽传书详细说明

    展开全文
  • 分析,飞鸽传书中 ,文件传输的核心过程。 非常详细,透彻。。对于看过飞鸽源码的人,还是有帮助的
  • 最近看到一些朋友在编写网络程序是遇到一些问题,故把以前做IPMSG时翻译的文档贴过来,希望对网络编程新手有所帮助,在寻找编程项目的同学们也可参照此文档写出自己的IPMSG。
  • 飞秋(FeiQ) V2.4┊局域网聊天传送文件_兼有飞鸽传书协议┊简体中文绿色修正版.rar
  • 自己想写个手机版的飞鸽,所以翻译了一下,就算不打算自己做个飞鸽,学习下人家的协议还是好的。 因为没用上,所以关于加密那段没翻译。
  • 飞鸽传书

    2009-10-28 12:25:00
    最新版飞鸽传书下载飞鸽...今天介绍的飞鸽传书(IPMsg),也是兼容飞鸽传书协议的一个软件,不过它的功能要更加强大。飞鸽传书(IPMsg)是一款局域网聊天传送文件的绿色软件,它参考了飞鸽传书(IPMsg)和QQ, 完全兼容飞鸽传

    最新版飞鸽传书下载

    飞鸽传书简介FreeEIM(飞鸽传书)下载地址大全

    局域网传输文件用什么工具?或许大多数人的选择都是飞鸽传书。不可否认,飞鸽传书的确是一个非常实用的局域网文件传输工具。今天介绍的飞鸽传书(IPMsg),也是兼容飞鸽传书协议的一个软件,不过它的功能要更加强大。

    飞鸽传书(IPMsg)是一款局域网聊天传送文件的绿色软件,它参考了飞鸽传书(IPMsg)和QQ, 完全兼容飞鸽传书(IPMsg)协议,具有局域网传送方便,速度快,操作简单的优点,使用上如果遇到问题,请在飞鸽传书论坛上提问,以便让更多的人共享答案。同时具有QQ中的一些功能。

    飞鸽传书功能说明飞鸽传书2007自发布以来,产品以其独特的设计、新颖的风格、完善的服务而受到了用户的好评,随着用户量的不断增加,用户在使用中给程序提了很多中肯的意见或建议,也使得飞鸽传书的功能越来越强大!产品用户量也在不断攀升,我们给予用户提供的是更便利的网上开店程序,用户给予我们的是改进的方案和建议,在此,我们再次感谢广大用户对我们的支持与帮助,我们会不断更新!最新版“飞鸽传书”、“IPMsg”等资源部分来源网络,仅用于学习交流!

    飞鸽传书扫描器飞鸽传书扫描器

    飞鸽传书2007 飞鸽传书2008 飞鸽传书2009 飞鸽传书帮助文档 飞鸽传书最近更新情况 飞鸽传书更新情况
    展开全文
  • 最近需要重写一个飞鸽传书,主要联系TCP、UDP,以及前边学习其他知识,算是综合练习吧。转载下飞鸽的网络协议 QUOTE: Original ipmsg protocol specification is written in Japanese.This document was...

     

    最近需要重写一个飞鸽传书,主要联系TCP、UDP,以及前边学习其他知识,算是综合练习吧。转载下飞鸽的网络协议

    QUOTE:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

    Original ipmsg protocol specification is written in Japanese.
    This document was translated by Mr.Kanazawa.
    This document is not verified yet.

    ----------------------------------------------------------------------
        IP Messenger communication protocol (Draft-9)   1996/02/21
                                    Modified 2003/01/14

                                        H.Shirouzu
                                  shirouzu@h.email.ne.jp
    ----------------------------------------------------------------------

    About IP Messenger
        This is a Send/Receive message service using the TCP/UDP Port.

    Characteristics
        IP Messenger can be installed in any OS if TCP/IP is used on your machine.
        Dynamic member recognition can be done within your network or specified network.
        You can exchange messages between all IPMsg members.

    Function description
        Use TCP/UDP port(default:2425). See the following descriptions
        (Message Send/Receive: UDP, File Send/Receive: TCP)

    1. Command

      1) Command functions (Low 8 bits from command number 32 bits)

        IPMSG_NOOPERATION     No Operation
        IPMSG_BR_ENTRY           Entry to service (Start-up with a Broadcast command)
        IPMSG_BR_EXIT           Exit from service (End with a Broadcast command)
        IPMSG_ANSENTRY           Notify a new entry
        IPMSG_BR_ABSENCE     Change absence mode

        IPMSG_BR_ISGETLIST     Search valid sending host members
        IPMSG_OKGETLIST           Host list sending notice
        IPMSG_GETLIST           Host list sending request
        IPMSG_ANSLIST           Host list sending

        IPMSG_SENDMSG           Message transmission
        IPMSG_RECVMSG           Message receiving check

        IPMSG_READMSG           Message open notice
        IPMSG_DELMSG           Message discarded notice
        IPMSG_ANSREADMSG     Message open confirmation notice(added from version-8 )

        IPMSG_GETFILEDATA     File Transfer request by TCP
        IPMSG_RELEASEFILES     Discard attachment file
        IPMSG_GETDIRFILES     Attachment hierarchical file request

        IPMSG_GETINFO           Get IPMSG version info.
        IPMSG_SENDINFO           Send IPMSG version info.

        IPMSG_GETABSENCEINFO     Get absence sentence
        IPMSG_SENDABSENCEINFO     Send absence sentence

        IPMSG_GETPUBKEY           RSA Public Key Acquisition
        IPMSG_ANSPUBKEY           RSA Public Key Response

      2) Option flag (High 24 bits from command number 32 bits)

        IPMSG_ABSENCEOPT     Absence mode(Member recognition command)
        IPMSG_SERVEROPT           Server(Reserved)
        IPMSG_DIALUPOPT           Send individual member recognition command

        IPMSG_SENDCHECKOPT     Transmission check
        IPMSG_SECRETOPT           Sealed message
        IPMSG_READCHECKOPT     Sealed message check(added from ver8 )
        IPMSG_PASSWORDOPT     Lock
        IPMSG_BROADCASTOPT     Broadcast message
        IPMSG_MULTICASTOPT     Multi-cast(Multiple casts selection)
        IPMSG_NEWMUTIOPT     New version multi-cast(reserved)
        IPMSG_AUTORETOPT     Automatic response(Ping-pong protection)
        IPMSG_NOLOGOPT           No log files
        IPMSG_NOADDLISTOPT     Notice to the members outside of BR_ENTRY

        IPMSG_FILEATTACHOPT     File attachment
        IPMSG_ENCRYPTOPT     Code

        IPMSG_NOPOPUPOPT     (No longer valid)
        IPMSG_RETRYOPT           Re-send flag(Use when acquiring HOSTLIST)

      3) Extended code flag (hex format combination)

        IPMSG_RSA_512
        IPMSG_RSA_1024
        IPMSG_RSA_2048
        IPMSG_RC2_40
        IPMSG_RC2_128
        IPMSG_RC2_256
        IPMSG_BLOWFISH_128
        IPMSG_BLOWFISH_256
        IPMSG_SIGN_MD5

      4) Extended files for attachment (fileattr low 8 bits)

        IPMSG_FILE_REGULAR
        IPMSG_FILE_DIR
        IPMSG_FILE_RETPARENT
        IPMSG_FILE_SYMLINK
        IPMSG_FILE_CDEV
        IPMSG_FILE_BDEV
        IPMSG_FILE_FIFO
        IPMSG_FILE_RESFORK

      5) Attachment file extended attribute(fileattr high 24 bits)

        IPMSG_FILE_RONLYOPT
        IPMSG_FILE_HIDDENOPT
        IPMSG_FILE_EXHIDDENOPT
        IPMSG_FILE_ARCHIVEOPT
        IPMSG_FILE_SYSTEMOPT

      6) Extended file attribute for attachment file

        IPMSG_FILE_UID
        IPMSG_FILE_USERNAME
        IPMSG_FILE_GID
        IPMSG_FILE_GROUPNAME
        IPMSG_FILE_PERM
        IPMSG_FILE_MAJORNO
        IPMSG_FILE_MINORNO
        IPMSG_FILE_CTIME
        IPMSG_FILE_MTIME
        IPMSG_FILE_ATIME
        IPMSG_FILE_CREATETIME

        IPMSG_FILE_CREATOR
        IPMSG_FILE_FILETYPE
        IPMSG_FILE_FINDERINFO

        IPMSG_FILE_ACL
        IPMSG_FILE_ALIASFNAME
        IPMSG_FILE_UNICODEFNAME


    2.Command format(Use all character strings)

      1) Command(Format version-1)

        Ver(1) : PacketNo : SenderName : SenderHost : CommandNo : AdditionalSection

      2) An example for Message Send/Receive by using the current command format

        "1:100:shirouzu:jupiter:32:Hello"


    3.Command process overview

      1) Member recognition

        An IPMSG_BR_ENTRY command notifies a new entry to the current
        members at start-up.

        All members add the new member to their list after getting a notification message.
        An IPMSG_ANSENTRY command sends a message back to the new member.

        The new member gets the current member data by a
        IPMSG_ANSENTRY command. All members can communicate as long as an
        IP packet exists.

        An IPMSG_BR_ABSENCE command broadcasts absence mode cancel or
        nickname change to all members. However, an IPMSG_ANSENTRY command
        does not send a message back, which is different from an IPMSG_BR_ENTRY
        command.

        IPMSG_BR_ENTRY, IPMSG_ANSENTRY, and IPMSG_BR_ABSENCE commands
        use an IPMSG_ABSENCEOPT flag for absence mode. Input a nickname to
        additional command.
        Add an IPMSG_DIALUPOPT flag for dial-up users who can't be reached by
        a broadcast command. A member recognition command needs to be
        sent individually to the members with this optional flag.

        (Extended group)IPMSG_BR_ENTRY and IPMSG_BR_ABSENCE commands
        sends a group name by adding the new group name after the current
        command format character strings (Input '\0' between the current
        command and extended name).

      2) Send/Receive Message
        Send Message uses an IPMSG_SENDMSG command that can input a message
        in the extended area.
        Receive Message sends back an IPMSG_RECVMSG command only
        if an IPMSG_SENDCHECKOPT flag is ON. Input the original packet number
        to the extended area.

        Broadcast Message Send uses an IPMSG_BOADCASTOPT command
        and an IPMSG_SENDMSG flag should be ON.
        Auto-Send packet(absence notice) needs to be added to IPMSG_AUTORETOPT
        for ping-pong protection. If either one or another packet is ON, then
        confirmation/auto-send packet is not sent back.

        Send Message Sealing needs to be an IPMSG_SECRETOPT packet ON.
        In this case, Receive Message sends an IPMSG_READMSG command.
        Input the original packet number to the extended area.

        (Additional IPMSG_NOADDLISTOPT)
        When receiving an IPMSG_SENDMSG packet from a host that is
        not on your Send/Receive list, IPMsg will either confirm a host by
        sending an IPMSG_BR_ENTRY command or add a host name to
        the Send/Receive list.
        However, single-shot Message Send/Receive action needs to be avoided.
        Add an IPMSG_NOADDLISTOPT flag to an IPMSG_SENDMSG command.

        (Additional IPMSG_READCHECKOPT from version-8 )
        When an IPMSG_READMSG command contains an IPMSG_READCHECKOPT flag,
        IPMsg process is the same as IPMSG_SENDMSG with an
        IPMSG_SENDCHECKOPT flag.
        However, Send Message uses an IPMSG_ANSREADMSG command,
        not IPMSG_RECVMSG.

      3) Message Send/Receive 亅encrypted extension (Added in the version-9 )

        Use the combination of Public-key(RSA) and common key(RC2/Blowfish).
        (Encrypted extension area is used in hex format.)

        (Public key acquisition)Send an IPMSG_GETPUBKEY command to Receive
        Message. Receive Message gets an IPMSG_ANSPUBKEY that
        means receiving RSA public key from Send Message.

        IPMSG_GETPUBKEY/IPMSG_ANSPUBKEY both require the value which is
        encryption capability (Exp. IPMSG_RSA_1024) flag uses "OR" at first
        part of extension

        In addition, In IPMSG_ANSPUBKEY, public key written as EE-NNNNNN
        E=Exponent丄N=method)devide by ':'. and Input the Fdelimiter '-'
        between E and N.

        This sequence can be skipped after the 2nd Send/Receive process by
        memorizing public key and encrypted data.
       
        (Encrypted message)After a sender creates a common key that is
        supported both sender and receiver, a common key can encrypt a message.
        In addition, a receiver's public key encrypts the common key.


        (Encrypted message transmission) IPMSG_ENCRYPTOPT is used in
        IPMSG_SENDMSG. At the first part of extension, input the value which
        is 'or' resoult from Convination of public key and common key type .
        Then use common key which encrypt with public key devide by ':'.
        Then input message which is eccrypted by public key devide by ':'.
        If both supports IPMSG_SIGN_XXX, then add ':' and signeture.

        Also, In the method of encode padding, PKCS#1ECB key is used for RSA,
        PKCS#5 CBC common key is used for RC2/blowfish.

        Also, The Packet related to Entry manifestation the capability of
        ecryption support using IPMSG_ENCRYPTOPT

      4) Extension with file attachment(Available from version-9 )

        An IPMSG_SENDMSG command with an IPMSG_FILEATTACHOPT flag for
        File transfer (download permission)notification sends a message
        with attachment.
        Input '\0' after the message and attachment file data.
       

        fileID:filename:size:mtime:fileattr[:extend-attr=val1
        [,val2...][:extend-attr2=...]]:\a:fileID...
        (size, mtime, and fileattr describe hex format.
          If a filename contains ':', please replace with "::".)

        When Receive Message downloads an attachment file, an IPMSG_GETFILEDATA
        command requests a data transmission packet to the TCP port that is the same number
        as the UDP sending port number. Input packetID:fileID: offset to the extended area.
        (Use all hex format.)
        File Transfer side receives the request. After recognizing that it's a correct request,
        then send the specified data (no format)

        When the data receiving side downloads a hierarchical attachment file,
        use an IPMSG_GETDIRFILES command and input a packetID:fileID
        to the extended area and send a data transmission request packet.
        (all hex format)

        Data sending side sends the following hierarchical data format.
        header-size:filename:file-size:fileattr[:extend-attr=val1
        [,val2...][:extend-attr2=...]]:contents-data
        Next headersize: Next filename...
        (All hex format except for filename and contetns-data)

        header-size is from the beginning of header-size to the delimiter ':'
        that is before contents-data. extend-attr can be omitted and used multiple
        extended attributes. Use '=' for data input.

        When fileattr is IPMSG_FILE_DIR, IPMsg recognizes that it is automatically
        in the directory, the next file data is after the directory.

        When fileattr is IPMSG_FILE_RETPARENT, IMPsg recognizes that it returns
        to the parent directory. In this case, File name is always "." and the attribute
        value is the current directory data.

        Sending process starts from the attachment directly and returns the
        IPMSG_FILE_RETPARENT command to the attachment directory.

        Add an IPMSG_FILEATTACHOPT flag for an Entry packet to support the
        attachment file.

      5) Other commands

        When acquiring different versions, send an IPMSG_GETINFO command.
        Receiving side sends the version information character string to
        extended area.

        Send an IPMSG_GETABSENCEINFO command for acquiring an absence message.
        Receiving side sends an IPMSG_SENDABSENCEINFO back if the status is absence mode.
        If the status is not absence mode, a character string "Not absence mode" will be sent back.

      6) Confirmation/Retry

        If a confirmation packet for IPMSG_SENDMSG or IPMSG_RECVMSG is not delivered
        within a specified time, then it will be sent again.
        A number of retry actions or interval period is depended on the current condition.


    4. Other

      1) Linefeed

        Linefeed characters in Send Message is standardized with UNIX type ('0x0a').
        Please change if needed.

      2) Delimiter ':'

        ':' is used as a delimiter. You can't use this delimiter for user name
        and host name.
        If the use/host names contain a ':', please replace with another sign,
        for an example ';'.
        Although using this delimiter isn't problem as yet, I may create an
        escape sequence.
       

      3) Kanji codes

        SJIS


    5. Contact e-mail address

        E-Mail shirouzu@h.email.ne.jp


    Note
        See ipmsg.h for command codes.
        Please e-mail me your comments and suggestions.

    <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
    阅读(1183) | 评论(1) | 转发(0) |
    给主人留下些什么吧!~~
    44_avatar_small.jpg

    wks_092009-07-10 17:47:10

    英文协议有的地方看不懂,还得硬着头皮读日文。

    评论热议
    展开全文
  • IPMsg飞鸽传书网络协议解析手记

    千次阅读 2015-09-18 14:36:35
     相信很多人都使用过飞鸽传书,这个小工具在局域网传输数据高效而便捷,自己在大二的时候就想看看飞鸽传书的源码,但那时候自己的水平有限,这几天有机会重写飞鸽传书,也对IPMSG的网络协议做了深入的研究,这里也...

    http://blog.chinaunix.net/uid-21222282-id-1829137.html


       相信很多人都使用过飞鸽传书,这个小工具在局域网传输数据高效而便捷,自己在大二的时候就想看看飞鸽传书的源码,但那时候自己的水平有限,这几天有机会重写飞鸽传书,也对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_fd=fd;
        int broadcast_en=1;
        char msg_buf[SND_BUF_LEN];
        char *use="test",*group="sunplusapp";
        socklen_t broadcast_len=sizeof(broadcast_en);
        long int msg_id=time((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_family=AF_INET;
        udp_addr.sin_port=htons(IPMSG_UDP_PORT);
        inet_pton(AF_INET,BR_IP,&udp_addr.sin_addr.s_addr);

    //下边的if 与else if :对于上线通告 下线等使用广播地址,其他的则否
        if( (p==NULL)&&(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 p=NULL \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_en=0;

    //  关掉广播
        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的一个难点就是文件夹的传输。今天就写这里,而却也做到这里。





    展开全文
  • 最近准备做一个自己的项目练手,系统的巩固一下自己最近学习的知识,网上找了一下,发现IPmsg(飞鸽传书)是个不错的选择:LINUX C/C++、多线程、线程间通信、QT。所以就决定做这个。  找了很多资料,决定从翻译...
  • IPMSG(飞鸽传书)协议翻译 http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1015775 最近看到一些朋友在编写网络程序是遇到一些问题,故把以前做IPMSG时翻译的文档贴过来,希望对网络编程新手有所...
  • 根据飞鸽传书协议在linux下实现飞鸽传输程序,并且与windows下飞鸽兼容。具体功能模块包括用户上线,下线,刷新查看在线用户,收发消息,传送文件/文件夹功能模块。 2.具体实现 2.1关键数据结构 /*命令的结构*/ ...
  • IPMsg 飞鸽传书 C#源码 TCP协议 Sockets 局域网内测试良好 大家可以下载试试看
  • 局域网传输文件用什么工具?大多数人的第一选择就是飞鸽传书。因为,飞鸽传书是一个...最新版飞鸽传书沿用传统的飞鸽传书协议,所以兼容所有遵循飞鸽传书协议的软件,唯一的不懂就是功能上它比其他同类软件更加强大。
  • 局域网传输文件用什么工具?大多数人的第一选择就是飞鸽传书。因为,飞鸽传书是一个...最新版飞鸽传书沿用传统的飞鸽传书协议,所以兼容所有遵循飞鸽传书协议的软件,唯一的不同就是功能上它比其他同类软件更加强大。
  • /***********************************************************本人(ypxing)根据下面的协议,C语言写的ipmsg(聊天,文件/文件夹传输)*请参见:http://blog.chinaunix.net/u1/35100/showart_689330.html************...
  • 推荐!局域网通信源码 C++飞鸽传书服务器客户端源码及传输协议 服务器源码 客户端源码 传输协议源码 C++写的 可以参考学习 CLeopard 2012/01/07

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 299
精华内容 119
关键字:

飞鸽传书协议