最近准备做一个自己的项目练手,系统的巩固一下自己最近学习的知识,网上找了一下,发现IPmsg(飞鸽传书)是个不错的选择:LINUX C/C++、多线程、线程间通信、QT。所以就决定做这个。
找了很多资料,决定从翻译协议开始,顺便熟悉协议,网上只能找到第9版的英文协议,最新的第十版只有日文,没办法,硬着头皮翻译日文吧。。
先吐槽一下google、bing、百度三家的翻译质量:google翻译英文很不错,日文感觉一般,bing是友人推荐,翻译日文质量在我意料之外,协议翻译基本也就是参考bing翻译的,google辅助。百度了就要坑很多了,翻译过程可以概述为:分词查字典。根本不做任何语法调整。(如果用这个方法翻英文,我怀疑”HOW ARE YOU“真的就翻成了”怎么试你“。汗。。。。)无力吐槽。。。
其他不多说了,直接上翻译协议,由于一点日文不懂,翻译的比较烂,见笑了。。
翻译中文版
1 /****************************************************************** 2 *原始的IPmsg协议规范是由日本人白水启章(H.Shirouzu)先生编写。 * 3 *本文档是由风之痕(Frank Song)翻译。 2012/10/30 4 *email:spf.doudou@gmail.com //如果有任何意见和建议,欢迎联系我 5 ******************************************************************/ 6 7 ---------------------------------------------------------------------- 8 IPmsg通信规范协议(草案第10版) 1996/02/21 9 修改于 2011/05/03 10 11 H.Shirouzu 12 http://ipmsg.org 13 ---------------------------------------------------------------------- 14 15 概述: 16 一个使用TCP/UDP端口接收和发送消息的服务程序。 17 18 功能特点: 19 IPmsg可以在任何使用TCP/IP协议的操作系统中使用,在你的计算机所在的 20 网络或者指定的网络中动态识别各个成员,并且可以在所有成员之间传递消息。 21 22 详细信息: 23 1、命令 24 1) 命令类型(命令编号(32位)的低8位) 25 26 IPMSG_NOOPERATION 无操作 27 IPMSG_BR_ENTRY 进入服务 (启动时对广播) 28 IPMSG_BR_EXIT 退出服务 (退出时对广播) 29 IPMSG_ANSENTRY 通知新输入条目 30 IPMSG_BR_ABSENCE 变更无人值守模式 31 32 IPMSG_BR_ISGETLIST 搜索有效的发送主机成员列表 33 IPMSG_OKGETLIST 通知发送主机列表 34 IPMSG_GETLIST 请求发送主机列表 35 IPMSG_ANSLIST 发送主机列表 36 37 IPMSG_SENDMSG 发送消息 38 IPMSG_RECVMSG 消息确认 39 40 IPMSG_READMSG 消息读取 41 IPMSG_DELMSG 消息丢弃 42 IPMSG_ANSREADMSG 消息读取确认(第8版追加) 43 44 IPMSG_GETFILEDATA 文件传输请求(使用TCP) 45 IPMSG_RELEASEFILES 文件丢弃 46 IPMSG_GETDIRFILES 文件夹传输请求 47 48 IPMSG_GETINFO 得到IPmsg版本信息 49 IPMSG_SENDINFO 发送IPmsg版本信息 50 51 IPMSG_GETABSENCEINFO 收到缺席通知 // 52 IPMSG_SENDABSENCEINFO 发送缺席通知 // 53 54 IPMSG_GETPUBKEY 取得RSA公钥 55 IPMSG_ANSPUBKEY 响应RSA公钥 56 57 2) 选项标记类型 (命令编号(32位)的高24位) 58 59 IPMSG_ABSENCEOPT 存在/缺席模式(成员识别命令中使用) 60 IPMSG_SERVEROPT 服务器模式(预留) 61 IPMSG_DIALUPOPT 发送单个成员识别命令 62 63 IPMSG_SENDCHECKOPT 传输校验 64 IPMSG_SECRETOPT 密封消息 65 IPMSG_READCHECKOPT 密封消息确认(第8版追加) 66 IPMSG_PASSWORDOPT 挂锁 67 IPMSG_BROADCASTOPT 广播(报告) 68 IPMSG_MULTICASTOPT 组播(多选) 69 IPMSG_NEWMULTIOPT 新版本组播(预留) 70 IPMSG_NOLOGOPT 不保留日志(建议) 71 IPMSG_NOADDLISTOPT 通知BR_ENTRY以外的成员 72 IPMSG_AUTORETOPT 自动应答(防止乒乓球?)(第10版加入) //? 73 74 IPMSG_FILEATTACHOPT 附件 75 IPMSG_ENCRYPTOPT 密码 76 IPMSG_ENCEXTMSGOPT 加密的附件信息 (第10版加入) //? 77 78 IPMSG_CAPUTF8OPT 兼容UTF-8 (第10版) 79 IPMSG_UTF8OPT 全部使用UTF-8 (第10版) 80 IPMSG_CLIPBOARDOPT 支持图像 (第10版) 81 82 IPMSG_RETRYOPT 重试标志(搜索HOSTLIST时使用) 83 84 3) 加密部分扩展标志 (16进制格式) 85 86 IPMSG_RSA_512 公钥加密(RSA 512bit) 87 IPMSG_RSA_1024 公钥加密(RSA 1024bit) 88 IPMSG_RSA_2048 公钥加密(RSA 2048bit) 89 IPMSG_RC2_40 共用密钥加密(RC2 40bit) 90 IPMSG_BLOWFISH_128 共用密钥加密(Blowfish 128bit) 91 IPMSG_AES_256 共用密加密(AES 256bit) 92 IPMSG_PACKETNO_IV 包字符串使用对称密钥密码 //? 93 IPMSG_ENCODE_BASE64 base64使用共用密钥密码 94 IPMSG_SIGN_SHA1 明文文本使用SHA1数字签名 95 96 4) 文件类型(fileattr的低8bit) 97 98 IPMSG_FILE_REGULAR 99 IPMSG_FILE_DIR 100 IPMSG_FILE_RETPARENT 101 IPMSG_FILE_SYMLINK 102 IPMSG_FILE_CDEV 103 IPMSG_FILE_BDEV 104 IPMSG_FILE_FIFO 105 IPMSG_FILE_RESFORK 106 107 5) 文件属性(fileattr的高24bit) 108 109 IPMSG_FILE_RONLYOPT 110 IPMSG_FILE_HIDDENOPT 111 IPMSG_FILE_EXHIDDENOPT 112 IPMSG_FILE_ARCHIVEOPT 113 IPMSG_FILE_SYSTEMOPT 114 115 6) 文件属性扩展部分 116 117 IPMSG_FILE_UID 118 IPMSG_FILE_USERNAME 119 IPMSG_FILE_GID 120 IPMSG_FILE_GROUPNAME 121 IPMSG_FILE_PERM 122 IPMSG_FILE_MAJORNO 123 IPMSG_FILE_MINORNO 124 IPMSG_FILE_CTIME 125 IPMSG_FILE_MTIME 126 IPMSG_FILE_ATIME 127 IPMSG_FILE_CREATETIME 128 129 IPMSG_FILE_CREATOR 130 IPMSG_FILE_FILETYPE 131 IPMSG_FILE_FINDERINFO 132 133 IPMSG_FILE_ACL 134 IPMSG_FILE_ALIASFNAME 135 136 2、命令格式(所有都表示为字符串) 137 1)命令(版本 1) 138 Ver(1):包号:用户名:主机名:命令编号:附加部分 139 2)使用当前命令格式收/发消息示例: 140 "1:100:shirouzu:jupiter:32:Hello" 141 142 3、命令处理概述 143 1)成员识别 144 145 在启动时,IPMSG_BR_ENTRY广播通知所有已存在的成员,正在启动一个新的成员主机。 146 147 广播之后,所有的成员把新成员加入到他们的列表中,一个IPMSG_ANSENTRY命令返回 148 给新成员。(注:win版本的IP地址范围和成员数目随机等待0-4秒) 149 150 新成员通过IPMSG_ANSENTRY命令得到现有成员的数据,只要有一个IP数据包存在,所有 151 的成员都可以进行通信。 152 153 IPMSG_BR_ABSENCE广播可以告诉所有成员无人值守模式或者昵称的变化。(与IPMSG_BR_ENTRY 154 命令不同,收到后IPMSG_ANSENTRY不返回) 155 156 IPMSG_BR_ENTRY, IPMSG_ANSENTRY, IPMSG_BR_ABSENCE命令使用IPMSG_ABSENCEOPT标志作为无人 157 模式或者昵称添加的命令。 158 IPMSG_DIALUPOPT命令用于拨号上网等不能接受广播的成员,此标志需要单独向成员发送确认命令。 159 160 (扩展组:)IPMSG_BR_ENTRY, IPMSG_ANSENTRY, IPMSG_BR_ABSENCE告诉成员如果输入的是传统 161 字符串,将会把组名设置为他所属组的名字。 162 163 2)收/发消息 164 165 使用IPMSG_SENDMSG发送消息,消息被放在命令的扩展区。接受方IPMSG_SENDCHECKOPT标志为ON 166 的话就只返回扩展区带有数据包编号的IPMSG_RECVMSG命令。 167 168 发送广播时使用IPMSG_BOADCASTOPT命令,IPMSG_SENDMSG标志为ON。自动发送的包添加 169 IPMSG_AUTORETOPT命令进行ping-pong保护,如果有一包为ON,确认/自动发送包不返回。 170 171 发送信息密封需要一个为ON的IPMSG_SECRETOPT包。这样,接收端讲发送一个扩展区带有包编号 172 的IPMSG_READMSG命令。 173 174 (追加:IPMSG_NOADDLISTOPT) 175 当从不再主机列表的中的主机收到 IPMSG_SENDMSG包时,IPmsg将会发送一个IPMSG_BR_ENTRY命令, 176 以确认主机是否存在,或者把主机加入主机列表中。但这种行为是应该被避免的,所以应该在 177 IPMSG_SENDMSG包中添加IPMSG_NOADDLISTOPT标志。 178 179 (第8版追加:IPMSG_READCHECKOPT ) 180 IPmsg处理带有IPMSG_READCHECKOPT标志的IPMSG_READMSG命令和处理带有IPMSG_SENDCHECKOPT标 181 志的IPMSG_SENDMSG命令是一样的,但是前者用IPMSG_ANSREADMSG应答,后者用IPMSG_RECVMSG。 182 183 此外,消息嵌入图像文件类型如4)中所述。(第10版加) 184 185 3)收/发消息加密(第9版加) 186 187 公钥与共钥配合使用。做为一般规则,加密用十六进制的格式。然而,IPMSG_ENCODE_BASE64具有 188 加密消息的功能,使用共通钥部分base64描述的方式,而不是十六进制。(第10版追) 189 190 (公钥的取得)向接收方发送IPMSG_GETPUBKEY命令,对方接受IPMSG_ANSPUBKEY,从而获取公钥。 191 IPMSG_GETPUBKEY/IPMSG_ANSPUBKEY开头的主机加密标志(IPMSG_RSA_2048 等)应设置为OR。 192 (详细信息见“1、3)加密标志”部分) 193 194 此外,在IPMSG_ANSPUBKEY中,公共密钥按照EE-NNNNNN(E=指数,N=方法)方式用“:”分开。同时, 195 在E和N中间添加“-”。这个序列在随后的收/发处理中可以通过记录公钥和加密信息来跳过。 196 197 (信息加密)当发送方建立一个收/发双方的共用密钥后,就用它来加密信息,另外,接收方的公钥 198 加密共用密钥。应该注意是否有组合执行限制(其他参考 4)。 199 200 (加密信息传输)在IPMSG_SENDMSG中设置IPMSG_ENCRYPTOPT标志。在扩展部分开始区域,加入公钥 201 和共用密钥的OR值。然后用以‘:’分隔的公钥加密共用密钥。(如果你使用了IPMSG_ENCODE_BASE64, 202 则会使用bash64编码,而不是十六进制)公钥加密共用密钥,共用密钥加密消息、明文和末尾的‘\0’。 203 204 (电子签名选项)如果两者都支持SHA-1电子签名,则设置IPMSG_SIGN_SHA1。明文的SHA-1值用私钥 205 加密,上述的加密正文追加在‘:’后边。 206 207 另外,在编码方式方面,RSA公钥根据密码/署名为PKCS#1-v1_5,AES/Blowfish/RC2共用密钥和使用 208 PKCS#5 CBC加密。 209 PMSG_PACKETNO_IV设置:IV是Packet使用的号码字符串(IV比较短的时候用0补全),如果IV不为0, 210 IPMSG_PACKETNO_IV就要被设置。 211 212 另外,Entry包如果设置了IPMSG_ENCRYPTOPT 标志,表明支持加密功能。 213 214 (用户名公钥指纹)(第10版加) 215 在末尾的用户名和SHA-1数字签名可以授予使用2048bitRSA,使用公钥指纹(下述)。 216 1)帮助保持用户名的唯一性 217 2)你可以使用假公钥防止身份信息被盗(收到信息后确认IPMSG_ANSPUBKEY与指纹相匹配) 218 219 创建用户名公钥指纹 220 1)生成公钥的SHA-1摘要值(160位) 221 2)末尾添加32位0成为192位的值 222 3)192位到64为分为3各字段,用XOR运算三个字段 223 4)64位值固定为16个字的十六进制字符串 224 5)以指纹字符串的形式把指纹添加到用户名末尾 225 226 此外,即使使用用户名公钥指纹,如果Entry包没有IPMSG_ENCRYPTOPT 或 227 IPMSG_GETPUBKEY/IPMSG_ANSPUBKEY的加密能力不包括IPMSG_RSA_2048/IPMSG_SIGN_SHA1 , 228 我建议你销毁报文。 229 230 4)文件扩展部分(第九版追加) 231 232 包含IPMSG_FILEATTACHOPT位的IPMSG_SENDMSG文件传输命令标志着有附件信息。 233 在信息后和附件信息后加入'\0'。 234 235 fileID:filename:size:mtime:fileattr[:extend-attr=val1 236 [,val2...][:extend-attr2=...]]:\a[:]fileID... 237 (大小,修改时间,十六进制描述的文件属性,如果文件名中含有':',请用"::"替代。) 238 239 当接收信息下载附件文件时,IPMSG_GETFILEDATA命令请求和UDP一样的TCP数据传输包端口。 240 在扩展区域添加packetID:fileID: offset(均使用十六进制格式) 241 文件发送方收到请求并判定它是正确的请求之后发送指定数据。(无格式) 242 243 当数据接收方下载划分的附件文件时,使用IPMSG_GETDIRFILES命令,并且将packetID:fileID 244 写入扩展区域,发送数据传输请求包。(均使用十六进制) 245 246 数据发送方发送下面划分的数据格式: 247 header-size:filename:file-size:fileattr[:extend-attr=val1 248 [,val2...][:extend-attr2=...]]:contents-data 249 下一个headersize:下一个filename... 250 (除了文件名和内容数据之外均使用十六进制格式) 251 252 header-size是从header-size开始到内容数据前的分隔符':'结束。扩展属性可以忽略并且 253 使用多扩展属性。使用'='for 数据输入。 254 255 当文件属性是IPMSG_FILE_DIR,飞鸽自动判定它是在目录中,下一个文件数据在目录之后。 256 257 当文件属性是IPMSG_FILE_RETPARENT,飞鸽判定它返回到父目录。在这种情况之下,文件名 258 总是'.'并且属性值是当前目录信息。 259 260 开始发送附件并且返回IPMSG_FILE_RETPARENT命令到附件目录。 261 262 另外,Entry包添加IPMSG_FILEATTACHOPT 标志表明支持附件文件。 263 264 (附件文件加密)在Entry包使用了IPMSG_SENDMSG和IPMSG_ENCEXTMSGOPT 的情况下,你可以 265 继续用上面的格式写‘\0’结束的明文信息,整个消息内容都会得到加密。 266 267 (添加图像附件)图像被粘贴到普通信息里面,以发送正常附件文件的形式发送。但是,指 268 定文件属性的IPMSG_FILE_CLIPBOARD 。在文件名字段中指定的文件,要包裹文件的类型扩展 269 名,通常使用PNG格式。 270 嵌入图像的位置信息,IPMSG_FILE_CLIPBOARDPOS=推荐的插入偏移位置可以用上面说的 271 extend-attr=val(都用十六进制表示)。但是,如果想插入多张图片,已经存在的图片 272 算作之前存在的一个字符。 273 274 另外,Entry包设置IPMSG_CLIPBOARDOPT来表明主机支持图像嵌入。 275 276 5)多语言扩展(UTF-8) 277 278 主机可以通过UTF-8发/收消息和文件来支持多语言通信。IPMSG_BR_ENTRY/IPMSG_ANS_ENTRY/IPMSG_BR_ABSENCE 279 通过设置IPMSG_CAPUTF8OPT标志表明可能使用UTF-8。如果IPMSG_CAPUTF8OPT设置IPMSG_UTF8OPT, 280 你就可以用UTF-8发送数据包(包含文件附件消息部分) 281 282 如果你接受附件文件的原信息中设置了IPMSG_UTF8OPT ,同时IPMSG_GETFILEDATA命令设置了IPMSG_UTF8OPT, 283 就可以接收数据的UTF-8形式的文件/目录的名称。 284 285 BR包(IPMSG_BR_ENTRY/IPMSG_BR_EXIT/IPMSG_BR_ABSENCE)中不能IPMSG_UTF8OPT标明UTF-8的使用。(现 286 有的非UTF-8客户端会出现问题)。因此,BR包后边加\0\n两个字节(如果不扩展的组名称,插入一个 287 '\0'作为虚拟名称,IPmsg会继续插入\0\n,即:\0\0\n) 288 之后,UTF-8中添加下面的项: 289 UN:用户名\n 290 HN:主机名\n 291 NN:昵称\n 292 GN:组名\n 293 另外,仅由ASCII码标识条目或者不存在的条目可以省略。 294 以上扩展如果与以前的不同看,以扩展的为标准。 295 296 6)其他命令 297 298 发送 IPMSG_GETINFO 命令来得到其他成员的IPmsg版本。接收方的版本信息通过 299 IPMSG_SENDINFO发送回来。 300 301 发送IPMSG_GETABSENCEINFO命令来得到成员缺席通知。如果你设置了无人模式通知, 302 接收方发送IPMSG_SENDABSENCEINFO。当离开的时候发送一个字符串(如:“Not absence mode”等) 303 304 7)确认/重试 305 306 对于IPMSG_SENDMSG 和IPMSG_RECVMSG 发送的数据包,要在一定时间内确认,如果确认超时, 307 则重发数据包。重试次数和超时时间依赖于实现。 308 309 4、其他 310 311 1)关于换行 312 313 消息中的换行符统一为UNIX格式(‘0x0a’),如有必要,请进行转换。 314 315 2)分隔符 316 317 用户名、主机名后使用':'分隔符,包含':'的名字不能使用分隔符。万一用户名主机名中包含 318 ':',请使用其他符号(如:';')代替。 319 320 3)字符码 321 322 如果设置了IPMSG_UTF8OPT,使用UTF-8,如果没有,使用CP932。 323 324 4)加密的组合 325 326 协议中没有可参考的实现,windows版本中,只支持下面3种: 327 328 1. IPMSG_RSA_2048 / IPMSG_AES_256 ... (*1) 329 2. IPMSG_RSA_1024 / IPMSG_BLOWFISH_128 ... (*2) 330 3. IPMSG_RSA_512 / IPMSG_RC2_40 331 332 (*1)IPMSG_PACKETNO_IV/IPMSG_SIGN_SHA1支持选线 333 (*2)IPMSG_PACKETNO_IV支持选项 334 335 5、联系信息 336 337 在http://ipmsg.org 中。 338 339 340 附录 341 342 命令代码,请参阅 ipmsg.h。 343 如果有任何建议,请发送给我。
原日文版
1 (Japanese) 2 ---------------------------------------------------------------------- 3 IP Messenger 通信プロトコル仕様(ドラフト10版) 1996/02/21 4 Modify 2011/05/03 5 6 H.Shirouzu 7 http://ipmsg.org 8 ---------------------------------------------------------------------- 9 10 概要 11 TCP/UDP Port を使用した、メッセージ送受信サービスです 12 13 特徴 14 TCP/IP が使えれば OS の種類を問いません。自分のいるネットワーク 15 内(および指定のネットワーク)で、動的なメンバ認識ができます。 16 メッセージ送信そのものは、IP接続している全メンバに対し行えます。 17 18 詳細 19 TCP/UDP ポート(default:2425)を使用して、以下の方法で処理します。 20 (メッセージ送受信:UDP、ファイル送受信:TCP を使用) 21 22 1.コマンド 23 24 1) コマンド種類 (command番号(32bit)のうち、下位8bit) 25 26 IPMSG_NOOPERATION 無操作 27 IPMSG_BR_ENTRY サービスにエントリ(起動時にBroadcast) 28 IPMSG_BR_EXIT サービスから抜ける(終了時にBroadcast) 29 IPMSG_ANSENTRY エントリを認識したことを通知 30 IPMSG_BR_ABSENCE 不在モード変更 31 32 IPMSG_BR_ISGETLIST ホストリスト送出可能メンバの探索 33 IPMSG_OKGETLIST ホストリスト送出可能通知 34 IPMSG_GETLIST ホストリスト送出要求 35 IPMSG_ANSLIST ホストリスト送出 36 37 IPMSG_SENDMSG メッセージの送信 38 IPMSG_RECVMSG メッセージの受信確認 39 40 IPMSG_READMSG 封書の開封通知 41 IPMSG_DELMSG 封書破棄通知 42 IPMSG_ANSREADMSG 封書の開封確認(8 版から追加) 43 44 IPMSG_GETFILEDATA 添付ファイル要求(TCP で使用) 45 IPMSG_RELEASEFILES 添付ファイル破棄 46 IPMSG_GETDIRFILES 添付階層ファイル要求 47 48 IPMSG_GETINFO IPMSGバージョン情報取得 49 IPMSG_SENDINFO IPMSGバージョン情報応答 50 51 IPMSG_GETABSENCEINFO 不在通知文取得 52 IPMSG_SENDABSENCEINFO 不在通知文応答 53 54 IPMSG_GETPUBKEY RSA 公開鍵取得 55 IPMSG_ANSPUBKEY RSA 公開鍵応答 56 57 2) オプションフラグ種類 (command番号(32bit)のうち、上位24bit) 58 59 IPMSG_ABSENCEOPT 不在モード(メンバ認識系コマンドで使用) 60 IPMSG_SERVEROPT サーバー(予約) 61 IPMSG_DIALUPOPT メンバ認識系のコマンドを個別に送り返す 62 63 IPMSG_SENDCHECKOPT 送信チェック 64 IPMSG_SECRETOPT 封書 65 IPMSG_READCHECKOPT 封書確認(8 版から追加) 66 IPMSG_PASSWORDOPT 錠前 67 IPMSG_BROADCASTOPT ブロードキャスト(同報) 68 IPMSG_MULTICASTOPT マルチキャスト(複数選択) 69 IPMSG_NEWMULTIOPT ニューバージョンマルチキャスト(予約) 70 IPMSG_NOLOGOPT ログに残さない(ことを推奨) 71 IPMSG_NOADDLISTOPT BR_ENTRYしていない一時メンバ通知 72 IPMSG_AUTORETOPT 自動応答(ピンポン防止用) 73 74 IPMSG_FILEATTACHOPT ファイル添付 75 IPMSG_ENCRYPTOPT 暗号 76 IPMSG_ENCEXTMSGOPT ファイル添付情報を暗号文に含める 77 78 IPMSG_CAPUTF8OPT UTF-8を使用する能力がある 79 IPMSG_UTF8OPT メッセージ全体に UTF-8を使用している 80 IPMSG_CLIPBOARDOPT メッセージ画像埋め込み添付をサポート 81 82 IPMSG_RETRYOPT 再送フラグ(HOSTLIST 取得時に使用) 83 84 3) 暗号拡張部用フラグ (拡張部に組み合わせを hex 表現で使用) 85 86 IPMSG_RSA_512 公開鍵(RSA 512bit)暗号能力 87 IPMSG_RSA_1024 公開鍵(RSA 1024bit)暗号能力 88 IPMSG_RSA_2048 公開鍵(RSA 2048bit)暗号能力 89 IPMSG_RC2_40 共通鍵(RC2 40bit)暗号能力 90 IPMSG_BLOWFISH_128 共通鍵(Blowfish 128bit)暗号能力 91 IPMSG_AES_256 共通鍵(AES 256bit)暗号能力 92 IPMSG_PACKETNO_IV 共通鍵暗号の IV に Packet番号文字列を利用 93 IPMSG_ENCODE_BASE64 暗号文の共通鍵以降の記述に base64 を利用 94 IPMSG_SIGN_SHA1 平文に SHA1電子署名を付与 95 96 4) 添付ファイル拡張用ファイル種類(fileattr下位8bit) 97 98 IPMSG_FILE_REGULAR 99 IPMSG_FILE_DIR 100 IPMSG_FILE_RETPARENT 101 IPMSG_FILE_SYMLINK 102 IPMSG_FILE_CDEV 103 IPMSG_FILE_BDEV 104 IPMSG_FILE_FIFO 105 IPMSG_FILE_RESFORK 106 107 5) 添付ファイル拡張用ファイル属性(fileattr上位24bit) 108 109 IPMSG_FILE_RONLYOPT 110 IPMSG_FILE_HIDDENOPT 111 IPMSG_FILE_EXHIDDENOPT 112 IPMSG_FILE_ARCHIVEOPT 113 IPMSG_FILE_SYSTEMOPT 114 115 6) 添付ファイル拡張用拡張ファイル属性 116 117 IPMSG_FILE_UID 118 IPMSG_FILE_USERNAME 119 IPMSG_FILE_GID 120 IPMSG_FILE_GROUPNAME 121 IPMSG_FILE_PERM 122 IPMSG_FILE_MAJORNO 123 IPMSG_FILE_MINORNO 124 IPMSG_FILE_CTIME 125 IPMSG_FILE_MTIME 126 IPMSG_FILE_ATIME 127 IPMSG_FILE_CREATETIME 128 129 IPMSG_FILE_CREATOR 130 IPMSG_FILE_FILETYPE 131 IPMSG_FILE_FINDERINFO 132 133 IPMSG_FILE_ACL 134 IPMSG_FILE_ALIASFNAME 135 136 137 2.コマンドフォーマット(すべて文字列として表現) 138 139 1) コマンド(フォーマットバージョン1) 140 141 Ver(1) : Packet番号 : 自User名 : 自Host名 : Command番号 : 追加部 142 143 2) 現在のコマンドフォーマットによるメッセージの送信文字列例 144 145 "1:100:shirouzu:jupiter:32:Hello" 146 147 148 3.コマンド処理概要 149 150 1) メンバ認識 151 152 起動時に、IPMSG_BR_ENTRY コマンドをブロードキャストし、すでに 153 立ち上がっているメンバに、新規参加を知らせます。 154 155 このブロードキャストにより、すでに立ち上がっているメンバは、 156 自分の送信先リストに新規参加メンバの情報を追加します。さらに、 157 IPMSG_ANSENTRY コマンドをその新規参加メンバに対し、返信します。 158 (備考: Win版では、メンバ数やIPアドレス距離等に基づいて、0-4秒 159 程度のランダムな待ちを入れています) 160 161 新規参加メンバは、この IPMSG_ANSENTRY を受信することにより、 162 すでに立ち上がっている全メンバの情報を得ることができます。 163 したがい、IPパケットが失われない限りは、全てのメンバが同一の 164 送信先リストを保持できるというわけです。 165 166 不在モードやニックネームの変更などを、メンバ全員に通知するには、 167 IPMSG_BR_ABSENCE をブロードキャストします。(IPMSG_BR_ENTRY と 168 違い、受け取ったメンバは IPMSG_ANSENTRY を返しません) 169 170 IPMSG_BR_ENTRY, IPMSG_ANSENTRY, IPMSG_BR_ABSENCE コマンドでは、 171 不在モードにあわせて IPMSG_ABSENCEOPT を立てて、コマンドの追加 172 部にはニックネームを入れます。また、ダイアルアップユーザなど、 173 ネットワーク指定のブロードキャストが届かないメンバは、さらに、 174 IPMSG_DIALUPOPT を立てます。このオプションが立っているメンバに 175 は、メンバ認識系のコマンドを個別に送出します。 176 177 (グループ化拡張)IPMSG_BR_ENTRY, IPMSG_ANSENTRY, IPMSG_BR_ABSENCE 178 において、従来のコマンドフォーマット文字列に続いて('\0'を挟んで) 179 グループ名を入れることによって、自分の所属(設定)するグループ名 180 を伝えることができます。 181 182 2) メッセージ送受信 183 184 メッセージ送信には IPMSG_SENDMSG を使用し、拡張部にメッセージ 185 本体を入れます。受信側は、IPMSG_SENDCHECKOPT が立っている場合 186 に限り、IPMSG_RECVMSG を返します。拡張部には元のパケット番号を 187 入れます。 188 189 ブロードキャストによるメッセージ送信は、IPMSG_BOADCASTOPT を 190 立てた IPMSG_SENDMSG を使用します。(不在通知文など)自動送出 191 されるパケットには、ピンポン防止のため IPMSG_AUTORETOPT をつけ 192 ます。どちらかのオプションが立っているパケットには、確認および 193 自動送出パケットを返しません。 194 195 封書で送出するには、IPMSG_SECRETOPT を立てたパケットを送出しま 196 す。この場合、受信側は開封時に IPMSG_READMSG を送出します。 197 拡張部には元のパケット番号を入れます。 198 199 (追加された、IPMSG_NOADDLISTOPT について) 200 自分の送信先リストに載っていないホストからの IPMSG_SENDMSG 201 パケット到着時には、 202 ・ 送信先に IPMSG_BR_ENTRY を送信して、ホスト存在確認を行う 203 ・ 直接自分の送信先リストに加える 204 のいずれかの処理を行うことにより、エントリー系パケット取りこぼ 205 しをフォローする実装が考えられます。しかし、エントリーを行わな 206 い単発メッセージ送信の場合は、これは望ましくない動作ですので、 207 この場合は受信ホストにそのようなフォロー動作をしないことを推奨 208 するため、IPMSG_SENDMSG に IPMSG_NOADDLISTOPT フラグを立てます。 209 210 (8版で追加された、IPMSG_READCHECKOPT について) 211 IPMSG_READMSG に、IPMSG_READCHECKOPT がついていた場合、丁度、 212 IPMSG_SENDMSG における IPMSG_SENDCHECKOPT のように処理します。 213 ただし、返信には、IPMSG_RECVMSG ではなく、IPMSG_ANSREADMSG 214 を使用します。 215 216 なお、メッセージの画像埋め込みは 4)ファイル添付拡張にて説明。 217 218 3) メッセージ送受信-暗号化拡張(9版で追加) 219 220 公開鍵(RSA)と共通鍵(AES/Blowfish/RC2)を組み合わせて実現します。 221 暗号関連の拡張部は原則として、hex フォーマットで表します。 222 ただし、暗号対応能力(後述)に IPMSG_ENCODE_BASE64 が含まれ 223 ている暗号メッセージ送信では、共通鍵部分以降の記述について 224 hex の代わりに、base64 で記述します。(10版で追加) 225 226 (公開鍵取得)まず受信側に IPMSG_GETPUBKEY を送信します。相手 227 から IPMSG_ANSPUBKEY を受け取ることにより、相手側 RSA 公開鍵 228 を得ます。IPMSG_GETPUBKEY/IPMSG_ANSPUBKEY ともに、拡張部の最初 229 に自ホストの暗号対応能力(IPMSG_RSA_2048 等)をフラグの OR で 230 表した値を入れます。 231 (フラグ詳細は「1. 3) 暗号拡張部用フラグ」をご覧ください) 232 233 さらに、IPMSG_ANSPUBKEY では':'を挟んで、公開鍵を EE-NNNNNN 234 (E=指数、N=法)という形を入れます。E と N の間には '-' を 235 入れて、区切りにします。 236 なお、2度目以降の送信時には、公開鍵および暗号対応能力を記憶 237 することにより、このシーケンスを省略することができます。 238 239 (メッセージ暗号化)送信側は、両者でサポートしている共通鍵 240 種類を選んでセッション用共通鍵を作り、その共通鍵を用いて本文 241 を暗号化します。さらにその共通鍵を相手側公開鍵で暗号化します。 242 なお、実装により組み合わせに制限があります(4. その他を参照) 243 244 (暗号メッセージ送信)IPMSG_SENDMSG に IPMSG_ENCRYPTOPT を 245 を立てて、拡張部の最初に、暗号化に使用した公開鍵/共通鍵種類 246 の組み合わせを OR で表現した値を入れます。続いて、':' を入れ 247 た後、(これ以降 IPMSG_ENCODE_BASE64 を立てた場合は hex の 248 代わりに base64 で記述します)、公開鍵で暗号化した共通鍵、 249 ':' を挟んで、共通鍵で暗号化した本文を入れます。 250 なお、平文には末尾の'\0'を含めます。 251 252 (電子署名オプション)両者が SHA-1による電子署名をサポート 253 している場合、IPMSG_SIGN_SHA1 立てた上で、平文への SHA-1ダイ 254 ジェスト値を自分自身の秘密鍵で暗号化した署名を、上記の暗号化 255 本文に続けて ':'をはさんで追加します。 256 257 なお、エンコード・パディング方式については、RSA 公開鍵による 258 暗号/署名では PKCS#1-v1_5、AES/Blowfish/RC2 共通鍵による暗号 259 化は PKCS#5 CBC を使用します。 260 IPMSG_PACKETNO_IV が立っている場合、IV は Packet番号文字列を 261 利用します。(IV サイズより短いため、残りは 0 で補完します) 262 IPMSG_PACKETNO_IV が立っていない場合、IV は 0 となります。 263 264 また、Entry 系パケットには IPMSG_ENCRYPTOPT を立て、暗号機能 265 をサポート可能であることを表明します。 266 267 (公開鍵指紋付ユーザ名)(10版で追加) 268 2048bitRSA かつ SHA-1 署名が利用可能なユーザは、ユーザIDの 269 末尾に、公開鍵を利用した指紋(後述)を付与することで、 270 1) ユーザ名の一意性を保ちやすくする 271 2) 公開鍵詐称によるなりすましを防ぐ(IPMSG_ANSPUBKEY受信時 272 に鍵と指紋の一致を確認) 273 ことができます。 274 275 公開鍵指紋付きユーザ名は以下のようにして作成します。 276 1) 公開鍵の法に対する SHA-1 ダイジェスト値(160bit)を生成 277 2) 末尾に 32bit の 0 を付与して、192bit の値とする 278 3) 192bit を 64bit*3つのフィールドに分割し、3つを XORする 279 4) 64bit値を16文字固定のhex文字列化する 280 5) ユーザ名の末尾に、ユーザ名-<指紋文字列> の形式で指紋を付加 281 282 なお、この公開鍵指紋付ユーザ名を使っているにもかかわらず、 283 Entry系に IPMSG_ENCRYPTOPT フラグが立っていない、もしくは 284 IPMSG_GETPUBKEY/IPMSG_ANSPUBKEY での暗号対応能力 に、 285 IPMSG_RSA_2048/IPMSG_SIGN_SHA1 が含まれていない場合は、 286 不正パケットとして破棄することを推奨します。 287 288 4) ファイル添付拡張(9版で追加) 289 290 ファイル添付(ダウンロード許可)通知するには、IPMSG_SENDMSG 291 に IPMSG_FILEATTACHOPT を立てたメッセージを送信します。 292 その際、通常(or 暗号)メッセージに続けて、'\0'をはさんで、 293 添付(ダウンロード許可)ファイル情報を列挙します。 294 295 fileID:filename:size:mtime:fileattr[:extend-attr=val1 296 [,val2...][:extend-attr2=...]]:\a[:]fileID... 297 (なお、size, mtime, fileattr は hex で表現します。 298 filenameに':'がある場合、"::"でエスケープします) 299 300 受信側が添付ファイルをダウンロードしたい場合、送信元UDPポート 301 と同じ番号のTCPポートに対して、IPMSG_GETFILEDATA コマンドを使 302 い、拡張部に packetID:fileID:offset を入れて、データ送信要求 303 パケットを出します。(すべてhex) 304 添付側がそのリクエストを受信して、送信要求を正しいと認めると、 305 その通信路に該当ファイルのデータを流します(フォーマットなし) 306 307 受信側が階層添付ファイルをダウンロードしたい場合は、コマンド 308 に IPMSG_GETDIRFILES を使い、拡張部に packetID:fileID を入れて 309 データ送信要求パケットを出します。(すべてhex) 310 311 データ送信側は、以下のフォーマットで階層データを流します。 312 header-size:filename:file-size:fileattr[:extend-attr=val1 313 [,val2...][:extend-attr2=...]]:contents-data 314 次のheadersize:次のfilename... 315 (filename と contetns-data 以外はすべて hex) 316 317 header-size は header-size の先頭から contents-data の直前の 318 ':'までのサイズをあらわします。extend-attr は省略可かつ複数 319 存在可能な拡張属性で、'='で対応するデータ値を入れます。 320 321 fileattr が IPMSG_FILE_DIR の場合、自動的にそのディレクトリに 322 潜った状態とみなして、後続のファイル情報が続きます。 323 324 fileattr が IPMSG_FILE_RETPARENT の場合、親ディレクトリに戻 325 ることを表し、ファイル名は常に"."です。このときの属性値は、 326 親ディレクトリに戻る前の、現在ディレクトリの情報を表します。 327 328 送信は添付ディレクトリ自体から開始し、最後に添付ディレクトリ 329 に戻る IPMSG_FILE_RETPARENT 情報を送信して終了を伝えます。 330 331 なお、Entry 系パケットに IPMSG_FILEATTACHOPT を立て、ファイル 332 添付をサポート可能であることを表明します。 333 334 (添付ファイル名暗号化)上記フォーマット内容を、メッセージ平文 335 末尾から '\0' に続けて記述した後、メッセージ全体の暗号化を行う 336 ことができます。その場合、Entry系パケットおよび IPMSG_SENDMSG 337 に IPMSG_ENCEXTMSGOPT を立てます。 338 339 (メッセージ画像埋め込み添付)メッセージに貼り付けられた画像 340 は、通常のファイル添付として送られます。ただし、fileattr に 341 IPMSG_FILE_CLIPBOARD を指定します。ファイル名フィールドには、 342 添付したい画像種類の拡張子を含むダミーファイル名を指定します。 343 通常は PNG を使います。 344 メッセージへの画像埋め込み位置は、上記の extend-attr=val の形 345 で IPMSG_FILE_CLIPBOARDPOS=挿入用推奨オフセット位置(文字単位) 346 を指定します(すべてhex表現)。ただし、複数の画像を挿入する場合、 347 自画像よりも前に存在する画像も1文字としてカウントします。 348 349 なお、メッセージ画像埋め込みをサポートしているホストは、Entry系 350 パケットに IPMSG_CLIPBOARDOPT を立てます。 351 352 5) 多言語(UTF-8)拡張 353 354 ファイル送受信を含むメッセージの送受信で UTF-8 での多言語通信を 355 行えるホストは、IPMSG_BR_ENTRY/IPMSG_ANS_ENTRY/IPMSG_BR_ABSENCE 356 コマンドで IPMSG_CAPUTF8OPT を立てたパケットを流すことで、UTF-8 357 での送受信が可能であることを表明します。お互いが IPMSG_CAPUTF8OPT 358 をサポートしている場合、IPMSG_UTF8OPT を立てた上で、メッセージ 359 (ファイル添付メッセージ部分を含む)を UTF-8 で表現したパケット 360 を送信することができます。 361 362 添付ファイルを受信する場合、元の添付メッセージに IPMSG_UTF8OPT 363 が立っていれば、同じく IPMSG_UTF8OPT を立てた IPMSG_GETFILEDATA 364 コマンドで添付ファイル転送要求を送ることで、ファイル名/ディレク 365 トリ名をUTF-8 で表現したデータを受信することができます。 366 367 BR系パケット(IPMSG_BR_ENTRY/IPMSG_BR_EXIT/IPMSG_BR_ABSENCE) に 368 ついては、IPMSG_UTF8OPT による UTF-8表現は使えません(既存の 369 非UTF-8クライアントに問題が発生するためです)。そのため、 370 BR系パケットでは、グループ名拡張の末尾に続いて、\0\n の 2バイト 371 を付加(グループ名拡張を入れない場合、ダミーのグループ名として 372 \0 を挿入した後、\0\n を続けます。つまり、\0\0\n となります) 373 した後、UTF-8 で以下のエントリを追加します。 374 UN:ユーザ名\n 375 HN:ホスト名\n 376 NN:ニックネーム\n 377 GN:グループ名\n 378 なお、ASCIIのみで表現可能なエントリや存在しないエントリは 379 省略して構いません。上記拡張と従来のフィールドが異なる場合、 380 拡張エントリを正しいものと解釈します。 381 382 6) その他のコマンド 383 384 他のメンバのバージョンを取得するには、IPMSG_GETINFO コマンド 385 を送ります。受信側は拡張部にバージョン情報の文字列を設定した 386 IPMSG_SENDINFO を送り返します。 387 388 不在モードメンバの不在通知文を取得するには、IPMSG_GETABSENCEINFO 389 コマンドを送ります。受信側は、不在モード中なら不在通知文を設定 390 した、IPMSG_SENDABSENCEINFO を送り返します。不在モード中でない 391 場合、適当な文字列("Not absence mode"など)を送り返します。 392 393 7) 確認・リトライ 394 395 一定時間以内に確認パケット(IPMSG_SENDMSG に対する、 396 IPMSG_RECVMSG など)が受け取れなかった場合、同一のパケットを 397 再送出します。リトライの回数・間隔については、実装依存です。 398 399 400 4. その他 401 402 1) 改行について 403 404 送出メッセージ内の改行文字は、UNIX形式に統一します('0x0a')。 405 必要に応じて、変換を行ってください。 406 407 2) デリミタ 408 409 デリミタに':'を使っている関係上、ユーザ名、ホスト名領域には、 410 ':'を含む名前は、使えません。万一、自ホスト名が':'を含んでいる 411 場合、他の文字(たとえば';')などに置き換えて使用してください。 412 413 3) 文字コード 414 415 IPMSG_UTF8OPT を付与した場合、文字コードは UTF-8、そうでない 416 場合は、CP932 の使用を想定しています。 417 418 4) 暗号化の組み合わせ 419 420 プロトコルではありませんが、リファレンス実装の説明ということで、 421 Windows版では、以下の3つの組み合わせのみサポートしています。 422 423 1. IPMSG_RSA_2048 / IPMSG_AES_256 ... (*1) 424 2. IPMSG_RSA_1024 / IPMSG_BLOWFISH_128 ... (*2) 425 3. IPMSG_RSA_512 / IPMSG_RC2_40 426 427 (*1) オプションで IPMSG_PACKETNO_IV/IPMSG_SIGN_SHA1 をサポート 428 (*2) オプションで IPMSG_PACKETNO_IV をサポート 429 430 431 5. 連絡先 432 433 http://ipmsg.org に記載しています。 434 435 436 附記 437 コマンドコードは、ipmsg.hを参照してください。 438 何かご意見・提案がありましたら、お寄せください。
英文第九版
1 Original ipmsg protocol specification is written in Japanese. 2 This document was translated by Mr.Kanazawa. 3 This document is not verified yet. (too old...) 4 5 ---------------------------------------------------------------------- 6 IP Messenger communication protocol (Draft-9) 1996/02/21 7 Modified 2003/01/14 8 9 H.Shirouzu 10 ---------------------------------------------------------------------- 11 12 About IP Messenger 13 This is a Send/Receive message service using the TCP/UDP Port. 14 15 Characteristics 16 IP Messenger can be installed in any OS if TCP/IP is used on your machine. 17 Dynamic member recognition can be done within your network or specified network. 18 You can exchange messages between all IPMsg members. 19 20 Function description 21 Use TCP/UDP port(default:2425). See the following descriptions 22 (Message Send/Receive: UDP, File Send/Receive: TCP) 23 24 1. Command 25 26 1) Command functions (Low 8 bits from command number 32 bits) 27 28 IPMSG_NOOPERATION No Operation 29 IPMSG_BR_ENTRY Entry to service (Start-up with a Broadcast command) 30 IPMSG_BR_EXIT Exit from service (End with a Broadcast command) 31 IPMSG_ANSENTRY Notify a new entry 32 IPMSG_BR_ABSENCE Change absence mode 33 34 IPMSG_BR_ISGETLIST Search valid sending host members 35 IPMSG_OKGETLIST Host list sending notice 36 IPMSG_GETLIST Host list sending request 37 IPMSG_ANSLIST Host list sending 38 39 IPMSG_SENDMSG Message transmission 40 IPMSG_RECVMSG Message receiving check 41 42 IPMSG_READMSG Message open notice 43 IPMSG_DELMSG Message discarded notice 44 IPMSG_ANSREADMSG Message open confirmation notice(added from version-8) 45 46 IPMSG_GETFILEDATA File Transfer request by TCP 47 IPMSG_RELEASEFILES Discard attachment file 48 IPMSG_GETDIRFILES Attachment hierarchical file request 49 50 IPMSG_GETINFO Get IPMSG version info. 51 IPMSG_SENDINFO Send IPMSG version info. 52 53 IPMSG_GETABSENCEINFO Get absence sentence 54 IPMSG_SENDABSENCEINFO Send absence sentence 55 56 IPMSG_GETPUBKEY RSA Public Key Acquisition 57 IPMSG_ANSPUBKEY RSA Public Key Response 58 59 2) Option flag (High 24 bits from command number 32 bits) 60 61 IPMSG_ABSENCEOPT Absence mode(Member recognition command) 62 IPMSG_SERVEROPT Server(Reserved) 63 IPMSG_DIALUPOPT Send individual member recognition command 64 65 IPMSG_SENDCHECKOPT Transmission check 66 IPMSG_SECRETOPT Sealed message 67 IPMSG_READCHECKOPT Sealed message check(added from ver8) 68 IPMSG_PASSWORDOPT Lock 69 IPMSG_BROADCASTOPT Broadcast message 70 IPMSG_MULTICASTOPT Multi-cast(Multiple casts selection) 71 IPMSG_NEWMUTIOPT New version multi-cast(reserved) 72 IPMSG_AUTORETOPT Automatic response(Ping-pong protection) 73 IPMSG_NOLOGOPT No log files 74 IPMSG_NOADDLISTOPT Notice to the members outside of BR_ENTRY 75 76 IPMSG_FILEATTACHOPT File attachment 77 IPMSG_ENCRYPTOPT Code 78 79 IPMSG_NOPOPUPOPT (No longer valid) 80 IPMSG_RETRYOPT Re-send flag(Use when acquiring HOSTLIST) 81 82 3) Extended code flag (hex format combination) 83 84 IPMSG_RSA_512 85 IPMSG_RSA_1024 86 IPMSG_RSA_2048 87 IPMSG_RC2_40 88 IPMSG_RC2_128 89 IPMSG_RC2_256 90 IPMSG_BLOWFISH_128 91 IPMSG_BLOWFISH_256 92 IPMSG_SIGN_MD5 93 94 4) Extended files for attachment (fileattr low 8 bits) 95 96 IPMSG_FILE_REGULAR 97 IPMSG_FILE_DIR 98 IPMSG_FILE_RETPARENT 99 IPMSG_FILE_SYMLINK 100 IPMSG_FILE_CDEV 101 IPMSG_FILE_BDEV 102 IPMSG_FILE_FIFO 103 IPMSG_FILE_RESFORK 104 105 5) Attachment file extended attribute(fileattr high 24 bits) 106 107 IPMSG_FILE_RONLYOPT 108 IPMSG_FILE_HIDDENOPT 109 IPMSG_FILE_EXHIDDENOPT 110 IPMSG_FILE_ARCHIVEOPT 111 IPMSG_FILE_SYSTEMOPT 112 113 6) Extended file attribute for attachment file 114 115 IPMSG_FILE_UID 116 IPMSG_FILE_USERNAME 117 IPMSG_FILE_GID 118 IPMSG_FILE_GROUPNAME 119 IPMSG_FILE_PERM 120 IPMSG_FILE_MAJORNO 121 IPMSG_FILE_MINORNO 122 IPMSG_FILE_CTIME 123 IPMSG_FILE_MTIME 124 IPMSG_FILE_ATIME 125 IPMSG_FILE_CREATETIME 126 127 IPMSG_FILE_CREATOR 128 IPMSG_FILE_FILETYPE 129 IPMSG_FILE_FINDERINFO 130 131 IPMSG_FILE_ACL 132 IPMSG_FILE_ALIASFNAME 133 IPMSG_FILE_UNICODEFNAME 134 135 136 2.Command format(Use all character strings) 137 138 1) Command(Format version-1) 139 140 Ver(1) : PacketNo : SenderName : SenderHost : CommandNo : AdditionalSection 141 142 2) An example for Message Send/Receive by using the current command format 143 144 "1:100:shirouzu:jupiter:32:Hello" 145 146 147 3.Command process overview 148 149 1) Member recognition 150 151 An IPMSG_BR_ENTRY command notifies a new entry to the current 152 members at start-up. 153 154 All members add the new member to their list after getting a notification message. 155 An IPMSG_ANSENTRY command sends a message back to the new member. 156 157 The new member gets the current member data by a 158 IPMSG_ANSENTRY command. All members can communicate as long as an 159 IP packet exists. 160 161 An IPMSG_BR_ABSENCE command broadcasts absence mode cancel or 162 nickname change to all members. However, an IPMSG_ANSENTRY command 163 does not send a message back, which is different from an IPMSG_BR_ENTRY 164 command. 165 166 IPMSG_BR_ENTRY, IPMSG_ANSENTRY, and IPMSG_BR_ABSENCE commands 167 use an IPMSG_ABSENCEOPT flag for absence mode. Input a nickname to 168 additional command. 169 Add an IPMSG_DIALUPOPT flag for dial-up users who can't be reached by 170 a broadcast command. A member recognition command needs to be 171 sent individually to the members with this optional flag. 172 173 (Extended group)IPMSG_BR_ENTRY and IPMSG_BR_ABSENCE commands 174 sends a group name by adding the new group name after the current 175 command format character strings (Input '\0' between the current 176 command and extended name). 177 178 2) Send/Receive Message 179 Send Message uses an IPMSG_SENDMSG command that can input a message 180 in the extended area. 181 Receive Message sends back an IPMSG_RECVMSG command only 182 if an IPMSG_SENDCHECKOPT flag is ON. Input the original packet number 183 to the extended area. 184 185 Broadcast Message Send uses an IPMSG_BOADCASTOPT command 186 and an IPMSG_SENDMSG flag should be ON. 187 Auto-Send packet(absence notice) needs to be added to IPMSG_AUTORETOPT 188 for ping-pong protection. If either one or another packet is ON, then 189 confirmation/auto-send packet is not sent back. 190 191 Send Message Sealing needs to be an IPMSG_SECRETOPT packet ON. 192 In this case, Receive Message sends an IPMSG_READMSG command. 193 Input the original packet number to the extended area. 194 195 (Additional IPMSG_NOADDLISTOPT) 196 When receiving an IPMSG_SENDMSG packet from a host that is 197 not on your Send/Receive list, IPMsg will either confirm a host by 198 sending an IPMSG_BR_ENTRY command or add a host name to 199 the Send/Receive list. 200 However, single-shot Message Send/Receive action needs to be avoided. 201 Add an IPMSG_NOADDLISTOPT flag to an IPMSG_SENDMSG command. 202 203 (Additional IPMSG_READCHECKOPT from version-8) 204 When an IPMSG_READMSG command contains an IPMSG_READCHECKOPT flag, 205 IPMsg process is the same as IPMSG_SENDMSG with an 206 IPMSG_SENDCHECKOPT flag. 207 However, Send Message uses an IPMSG_ANSREADMSG command, 208 not IPMSG_RECVMSG. 209 210 3) Message Send/Receive encrypted extension (Added in the version-9) 211 212 Use the combination of Public-key(RSA) and common key(RC2/Blowfish). 213 (Encrypted extension area is used in hex format.) 214 215 (Public key acquisition)Send an IPMSG_GETPUBKEY command to Receive 216 Message. Receive Message gets an IPMSG_ANSPUBKEY that 217 means receiving RSA public key from Send Message. 218 219 IPMSG_GETPUBKEY/IPMSG_ANSPUBKEY both require the value which is 220 encryption capability (Exp. IPMSG_RSA_1024) flag uses "OR" at first 221 part of extension 222 223 In addition, In IPMSG_ANSPUBKEY, public key written as EE-NNNNNN 224 E=Exponent, N=method)devide by ':'. and Input the Fdelimiter '-' 225 between E and N. 226 227 This sequence can be skipped after the 2nd Send/Receive process by 228 memorizing public key and encrypted data. 229 230 (Encrypted message)After a sender creates a common key that is 231 supported both sender and receiver, a common key can encrypt a message. 232 In addition, a receiver's public key encrypts the common key. 233 234 235 (Encrypted message transmission) IPMSG_ENCRYPTOPT is used in 236 IPMSG_SENDMSG. At the first part of extension, input the value which 237 is 'or' resoult from Convination of public key and common key type . 238 Then use common key which encrypt with public key devide by ':'. 239 Then input message which is eccrypted by public key devide by ':'. 240 If both supports IPMSG_SIGN_XXX, then add ':' and signeture. 241 242 Also, In the method of encode padding, PKCS#1ECB key is used for RSA, 243 PKCS#5 CBC common key is used for RC2/blowfish. 244 245 Also, The Packet related to Entry manifestation the capability of 246 ecryption support using IPMSG_ENCRYPTOPT 247 248 4) Extension with file attachment(Available from version-9) 249 250 An IPMSG_SENDMSG command with an IPMSG_FILEATTACHOPT flag for 251 File transfer (download permission)notification sends a message 252 with attachment. 253 Input '\0' after the message and attachment file data. 254 255 256 fileID:filename:size:mtime:fileattr[:extend-attr=val1 257 [,val2...][:extend-attr2=...]]:\a:fileID... 258 (size, mtime, and fileattr describe hex format. 259 If a filename contains ':', please replace with "::".) 260 261 When Receive Message downloads an attachment file, an IPMSG_GETFILEDATA 262 command requests a data transmission packet to the TCP port that is the same number 263 as the UDP sending port number. Input packetID:fileID:offset to the extended area. 264 (Use all hex format.) 265 File Transfer side receives the request. After recognizing that it's a correct request, 266 then send the specified data (no format) 267 268 When the data receiving side downloads a hierarchical attachment file, 269 use an IPMSG_GETDIRFILES command and input a packetID:fileID 270 to the extended area and send a data transmission request packet. 271 (all hex format) 272 273 Data sending side sends the following hierarchical data format. 274 header-size:filename:file-size:fileattr[:extend-attr=val1 275 [,val2...][:extend-attr2=...]]:contents-data 276 Next headersize: Next filename... 277 (All hex format except for filename and contetns-data) 278 279 header-size is from the beginning of header-size to the delimiter ':' 280 that is before contents-data. extend-attr can be omitted and used multiple 281 extended attributes. Use '=' for data input. 282 283 When fileattr is IPMSG_FILE_DIR, IPMsg recognizes that it is automatically 284 in the directory, the next file data is after the directory. 285 286 When fileattr is IPMSG_FILE_RETPARENT, IMPsg recognizes that it returns 287 to the parent directory. In this case, File name is always "." and the attribute 288 value is the current directory data. 289 290 Sending process starts from the attachment directly and returns the 291 IPMSG_FILE_RETPARENT command to the attachment directory. 292 293 Add an IPMSG_FILEATTACHOPT flag for an Entry packet to support the 294 attachment file. 295 296 5) Other commands 297 298 When acquiring different versions, send an IPMSG_GETINFO command. 299 Receiving side sends the version information character string to 300 extended area. 301 302 Send an IPMSG_GETABSENCEINFO command for acquiring an absence message. 303 Receiving side sends an IPMSG_SENDABSENCEINFO back if the status is absence mode. 304 If the status is not absence mode, a character string "Not absence mode" will be sent back. 305 306 6) Confirmation/Retry 307 308 If a confirmation packet for IPMSG_SENDMSG or IPMSG_RECVMSG is not delivered 309 within a specified time, then it will be sent again. 310 A number of retry actions or interval period is depended on the current condition. 311 312 313 4. Other 314 315 1) Linefeed 316 317 Linefeed characters in Send Message is standardized with UNIX type ('0x0a'). 318 Please change if needed. 319 320 2) Delimiter ':' 321 322 ':' is used as a delimiter. You can't use this delimiter for user name 323 and host name. 324 If the use/host names contain a ':', please replace with another sign, 325 for an example ';'. 326 Although using this delimiter isn't problem as yet, I may create an 327 escape sequence. 328 329 330 3) Kanji codes 331 332 CP932 333 334 335 5. Contact 336 http://ipmsg.org/ (Japanese site) 337 http://ipmsg.org/index.html.en (English site) 338 339 340 Note 341 See ipmsg.h for command codes. 342 Please e-mail me your comments and suggestions.