{"id":717,"date":"2020-08-03T02:25:52","date_gmt":"2020-08-02T18:25:52","guid":{"rendered":"https:\/\/aichh.com\/?p=717"},"modified":"2020-08-03T02:27:41","modified_gmt":"2020-08-02T18:27:41","slug":"%e5%8e%bb%e4%b8%ad%e5%bf%83%e5%8c%96%e7%9a%84%e7%bd%91%e7%bb%9c%e8%ae%be%e8%ae%a1-p2p%e7%9a%84%e5%ae%9e%e7%8e%b0","status":"publish","type":"post","link":"https:\/\/aichh.com\/717.html","title":{"rendered":"\u53bb\u4e2d\u5fc3\u5316\u7684\u7f51\u7edc\u8bbe\u8ba1 \u2014 P2P\u7684\u5b9e\u73b0"},"content":{"rendered":"<!--wp-compress-html--><!--wp-compress-html no compression--><p>\u968f\u7740\u533a\u5757\u94fe\u7684\u8d8a\u6765\u8d8a\u706b\uff0c\u53bb\u4e2d\u5fc3\u5316\u7684\u7f51\u7edc\u8bbe\u8ba1\u518d\u6b21\u88ab\u62ff\u5230\u6280\u672f\u4eba\u5458\u9762\u524d\u3002\u5728\u8fd9\u91cc\u6211\u4f7f\u7528\u975e\u5e38\u901a\u4fd7\u7684\u8bed\u8a00\uff0c\u5e2e\u5927\u5bb6\u6765\u7406\u89e3\u53bb\u4e2d\u5fc3\u5316\u7684\u7f51\u7edc\u8bbe\u8ba1\u7684\u57fa\u7840\u2014\u7f51\u7edc\u7a7f\u900f\u3002\u518d\u4f7f\u7528\u4ee3\u7801\u6765\u5b9e\u73b0\u7a7f\u900f\u3002\u5982\u679c\u9610\u8ff0\u4e0d\u5230\u4f4d\u7684\u5730\u65b9\uff0c\u6b22\u8fce\u5927\u5bb6\u629b\u7816\u3002\u4ee3\u7801\u5728\u6b64\uff1a\u00a0https:\/\/github.com\/wangbojing\/P2PServer<\/p>\n<p>\u5728\u6709\u4e2d\u5fc3\u5316\u670d\u52a1\u5668\u7684\u7f51\u7edc\u4e2d\uff0c\u5ba2\u6237\u7aef\uff0c\u670d\u52a1\u5668\uff0c\u7f51\u5173\u6784\u6210\u7f51\u7edc\u62d3\u6251\u56fe\u3002\u5982\u4e0b\u56fe1\u6240\u793a\uff1a\u7531\u4e8e\u540e\u7eed\u51fa\u73b0\u7684\u540d\u8bcd\u6982\u5ff5\u5f88\u591a\uff0c\u5148\u7ea6\u6cd5\u4e09\u7ae0\uff0c\u5728\u8fd9\u91cc\u7edf\u4e00\u4e00\u4e0b\u79f0\u547c\uff1a\u6240\u6709\u7684\u7ec8\u7aef\u673a\u5668\u6210\u4e3a\u5ba2\u6237\u7aef\uff0c\u4e0d\u540c\u5ba2\u6237\u7aef\u4f7f\u7528\u5927\u5199\u5b57\u6bcd\u533a\u5206\uff08A,B,C,\u2026\uff09\uff1b\u5ba2\u6237\u7aef\u4e0a\u9762\u8fd0\u884c\u7684\u5e94\u7528\u7a0b\u5e8f\u7edf\u4e00\u79f0\u4e3a\u5ba2\u6237\u7a0b\u5e8f\uff0c\u4e0d\u540c\u7684\u5e94\u7528\u7a0b\u5e8f\u4f7f\u7528\u4e0d\u6570\u5b57\u533a\u5206\uff081,2,3,\u2026\uff09\u3002\u4f5c\u4e3a\u670d\u52a1\u5668\u7684\u7269\u7406\u673a\u79f0\u4e3a\u670d\u52a1\u5668\uff0c\u800c\u670d\u52a1\u5668\u4e0a\u8fd0\u884c\u7684\u7a0b\u5e8f\u79f0\u4e3a\u670d\u52a1\u7a0b\u5e8f\uff0c\u540e\u6587\u4e2d\u6bcf\u4e00\u4e2a\u62d3\u6251\u7ec4\u4ef6\u90fd\u53ea\u6709\u4e00\u4e2aIP\u5730\u5740\u3002\u4e3a\u5ba2\u6237\u7aef\u63d0\u4f9b\u516c\u7f51IP\u670d\u52a1\u7684\u7ec4\u4ef6\u79f0\u4e3a\u7f51\u5173\u3002<\/p>\n<p><a href=\"https:\/\/s1.51cto.com\/wyfs02\/M00\/A5\/FA\/wKioL1nGkdbRpj8jAAB4putmiMQ017.png-wh_500x0-wm_3-wmp_4-s_1853812742.png\"><img loading=\"lazy\" decoding=\"async\" title=\"wKioL1nGkdbRpj8jAAB4putmiMQ017.png-wh_500x0-wm_3-wmp_4-s_1853812742\" src=\"https:\/\/aichh.com\/wp-content\/uploads\/2020\/08\/wKioL1nGkdbRpj8jAAB4putmiMQ017.png-wh_500x0-wm_3-wmp_4-s_1853812742.png\" width=\"500\" height=\"366\"><\/a><\/p>\n<p>\u56fe1 \u4e2d\u5fc3\u5316\u670d\u52a1\u5668\u7684\u7f51\u7edc\u62d3\u6251\u56fe<\/p>\n<p>\u4ece\u7f51\u5173\u6620\u5c04\u5230\u5ba2\u6237\u7aef\u4e2d\u7684\u7f51\u7edc\u7ed3\u6784\uff0c\u8fd9\u91cc\u9700\u8981\u5f15\u5165\u4e00\u4e2aNAT\u7684\u6982\u5ff5\u3002\u4ec0\u4e48NAT\u5462\uff1f\u4e2d\u6587\u540d\u53eb\u7f51\u7edc\u5730\u5740\u8f6c\u6362\uff0c\u4e60\u60ef\u79f0\u4e3a\u7f51\u7edc\u5730\u5740\u6620\u5c04\u3002\u4e3a\u4ec0\u4e48\u9700\u8981\u7f51\u7edc\u5730\u5740\u6620\u5c04\u5462\uff1f\uff1a\u9700\u8981\u8bf4\u5230IPV4\u7f51\u7edc\u5730\u5740\u5df2\u7ecf\u7528\u5b8c\uff0c\u5168\u90e8\u4f7f\u7528IPV6\u53c8\u4f1a\u9020\u6210\u5f88\u591a\u53ea\u652f\u6301IPV4\u7684\u7ec8\u7aef\u8bbe\u5907\u65e0\u6cd5\u6b63\u5e38\u4f7f\u7528\uff0c\u6240\u4ee5\u7f51\u7edc\u5730\u5740\u6620\u5c04\u5e94\u8fd0\u800c\u751f\uff0c\u5fcd\u8fb1\u8d1f\u91cd\u3002\u624d\u4f1a\u6709\u6211\u4eec\u73b0\u5728\u6240\u8c13\u7684\u7f51\u7edc\u7a7f\u900f\u7684\u51fa\u73b0\u3002\u5230\u5e95\u600e\u4e48\u6620\u5c04\u7684\uff1f\u5982\u56fe2\u7f51\u7edc\u5730\u5740\u6620\u5c04\u6240\u793a\u3002\u5ba2\u6237\u7a0b\u5e8f\u4f7f\u7528192.168.0.234:7890\u53d1\u9001\u6570\u636e\uff0c\u901a\u8fc7\u7f51\u5173\u7684\u7f51\u7edc\u5730\u5740\u6620\u5c04\u5728\u516c\u7f51\u88ab\u8f6c\u6362\u4e3a112.93.116.102:6834\uff0c\u88ab\u4e92\u8054\u7f51\u4e0a\u7684\u5927\u5bb6\u6240\u8ba4\u77e5\u3002\u6b64\u65f6\u5728\u516c\u7f51\u4e0a\u4f7f\u7528\u5ba2\u6237\u7a0b\u5e8f\u7684ip\u4e0e\u7aef\u53e3\u88ab112.93.116.102:6834\u4ee3\u66ff\u3002\u5728\u8fd9\u91cc\u5927\u5bb6\u5e94\u8be5\u660e\u767d\u4e86NAT\u662f\u4f55\u8bb8\u7269\u79cd\u4e86\u3002<\/p>\n<p><a href=\"https:\/\/s1.51cto.com\/wyfs02\/M02\/07\/49\/wKiom1nGkg_Q03LBAABXmGw3UOQ516.png-wh_500x0-wm_3-wmp_4-s_890112037.png\"><img loading=\"lazy\" decoding=\"async\" title=\"wKiom1nGkg_Q03LBAABXmGw3UOQ516.png-wh_500x0-wm_3-wmp_4-s_890112037\" src=\"https:\/\/aichh.com\/wp-content\/uploads\/2020\/08\/wKiom1nGkg_Q03LBAABXmGw3UOQ516.png-wh_500x0-wm_3-wmp_4-s_890112037.png\" width=\"500\" height=\"366\"><\/a><\/p>\n<p>\u56fe2 \u7f51\u7edc\u5730\u5740\u6620\u5c04<\/p>\n<p>\u4e3a\u4e86\u4fdd\u6301\u65b0\u624b\u798f\u97f3\uff0c\u4e1a\u754c\u826f\u5fc3\u7684\u6001\u5ea6\u3002\u4ec0\u4e48\u662f\u7a7f\u900f\uff1f\u56e0\u4e3aNAT\u662f\u5ba2\u6237\u7a0b\u5e8f\u53d1\u8d77\u7684\uff0c\u7f51\u7edc\u4e3a\u4e86\u4fdd\u6301\u901a\u8baf\u65b0\u5efa\u7684\u4e00\u4e2a\u4e34\u65f6\u724c\u7167\uff0c\u968f\u65f6\u53ef\u80fd\u88ab\u6536\u56de\uff0c\u800c\u4e14\u91cd\u65b0\u53d1\u8d77\u540e\u7684\u724c\u7167\u4e0d\u4e00\u6837\u3002\u4ece\u800c\u5916\u754c\u53ca\u65f6\u77e5\u9053\u4e86\u8fd9\u4e2a\u4e34\u65f6\u724c\u7167\u4e5f\u6ca1\u6709\u7528\u3002\u6240\u4ee5\u9700\u8981\u901a\u8fc7\u7a7f\u900f\u5728\u7f51\u5173\u4e0a\u9762\u6253\u4e2a\u6d1e\uff0c\u6765\u4e3a\u5916\u754c\u8fdb\u884c\u670d\u52a1\u3002\u90a3NAT\u4e0e\u7a7f\u900f\u6709\u4ec0\u4e48\u5173\u7cfb\u5462\uff1f\u6b63\u56e0\u4e3a\u6709\u4e86NAT\u624d\u9700\u8981\u7a7f\u900f\uff0c\u5982\u679c\u662fIPV6\u6bcf\u4e2a\u5ba2\u6237\u7aef\u4e00\u4e2aIP\u5730\u5740\uff0c\u90a3\u5c31\u4e0d\u9700\u8981\u76f4\u63a5\u53ef\u4ee5\u627e\u5230\u5ba2\u6237\u7aef\u4e86\u3002<\/p>\n<p>&nbsp;<\/p>\n<p>\u7f51\u7edc\u5730\u5740\u6620\u5c04<\/p>\n<p>&nbsp;<\/p>\n<p>\u7531\u4e8e\u7f51\u5173\u7684\u5b89\u5168\u6027\u8981\u6c42\u4e0d\u4e00\u81f4\uff0c\u5c31\u51fa\u73b0\u56db\u79cd\u4e0d\u540c\u7684NAT\u65b9\u5f0f\u3002\u5206\u522b\u8fdb\u884c\u9610\u8ff0\uff1a<\/p>\n<p>\u7b2c\u4e00\u79cd\u5b8c\u5168\u9525\u5f62NAT\uff0c\u82f1\u6587\u540d\u53ebFull Cone NAT\u3002\u5982\u56fe3\u5b8c\u5168\u9525\u5f62NAT\u6240\u793a\uff0c\u5ba2\u6237\u7a0b\u5e8f(192.168.0.234:7890)\u4e0e\u670d\u52a1\u5668A(13.44.178.98:9800)\u901a\u4fe1\uff0c\u901a\u8fc7\u7f51\u5173\u7684\u5730\u5740\u8f6c\u6362\u4ea7\u751f\u7684\u4e34\u65f6\u724c\u7167\u7684\u516c\u7f51\u5730\u5740\uff08112.93.116.102:6834\uff09\uff0c\u670d\u52a1\u5668B\uff08157.78.13.156:23456\uff09\u53d1\u9001\u6570\u636e\u5230\u516c\u7f51\u5730\u5740\uff08112.93.116.102:6834\uff09\uff0c\u5982\u679c\u5ba2\u6237\u7a0b\u5e8f(192.168.0.234:7890)\u80fd\u591f\u6536\u5230\u670d\u52a1\u5668B\uff08157.78.13.156:23456\uff09\u53d1\u9001\u7684\u6570\u636e\uff0c\u8fd9\u79cdNAT\u6620\u5c04\u5173\u7cfb\u4e3a\u5b8c\u5168\u9525\u5f62NAT\uff1b<\/p>\n<p><a href=\"https:\/\/s4.51cto.com\/wyfs02\/M02\/07\/49\/wKiom1nGkhGRaHQkAABqja7Jt88832.png-wh_500x0-wm_3-wmp_4-s_3071185391.png\"><img loading=\"lazy\" decoding=\"async\" title=\"wKiom1nGkhGRaHQkAABqja7Jt88832.png-wh_500x0-wm_3-wmp_4-s_3071185391\" src=\"https:\/\/aichh.com\/wp-content\/uploads\/2020\/08\/wKiom1nGkhGRaHQkAABqja7Jt88832.png-wh_500x0-wm_3-wmp_4-s_3071185391.png\" width=\"500\" height=\"399\"><\/a><\/p>\n<p>\u56fe3 \u5b8c\u5168\u9525\u5f62NAT<\/p>\n<p>\u7b2c\u4e8c\u79cd\u9650\u5236\u9525\u5f62NAT\uff0c\u82f1\u6587\u540d\u53ebRestrictedCone NAT\u3002\u5728\u56fe3 \u5b8c\u5168\u9525\u5f62NAT\u4e2d\uff0c\u5982\u679c\u5ba2\u6237\u7a0b\u5e8f(192.168.0.234:7890)\u4e0d\u80fd\u6536\u5230\u670d\u52a1\u5668B\uff08157.78.13.156:23456\uff09\u53d1\u9001\u7684\u6570\u636e\uff0c\u8fd9\u79cdNAT\u6620\u5c04\u5173\u7cfb\u4e3a\u9650\u5236\u578b\u9525\u5f62NAT\u3002<\/p>\n<p>&nbsp;<\/p>\n<p>\u7b2c\u4e09\u79cd\u7aef\u53e3\u9650\u5236\u9525\u5f62NAT\uff0c\u82f1\u6587\u540d\u53ebPort RestrictedCone NAT\u3002\u5ba2\u6237\u7a0b\u5e8f(192.168.0.234:7890)\u53d1\u9001\u6570\u636e\u7ed9\u670d\u52a1\u7a0b\u5e8f\uff0813.44.178.98:9800\uff09,\u7f51\u5173\u901a\u8fc7\u7f51\u7edc\u5730\u5740\u8f6c\u6362\u4ea7\u751f\u7684\u5730\u5740\uff08112.93.116.102:6834\uff09,\u540c\u6837\u7684\u670d\u52a1\u5668\u5185\u7684\u53e6\u4e00\u4e2a\u670d\u52a1\u7a0b\u5e8f\uff0813.44.178.178:9801\uff09\u53d1\u9001\u6570\u636e\u7ed9\u7f51\u5173\uff08112.93.116.102:6834\uff09\u5730\u5740\uff0c\u5982\u679c\u5ba2\u6237\u7a0b\u5e8f(192.168.0.234:7890)\u80fd\u591f\u6536\u5230\uff0c\u5219\u4e3a\u9650\u5236\u9525\u5f62NAT\uff0c\u5982\u679c\u5ba2\u6237\u7a0b\u5e8f(192.168.0.234:7890)\u4e0d\u80fd\u6536\u5230\uff0c\u5219\u4e3a\u7aef\u53e3\u9650\u5236\u9525\u5f62NAT\u3002<\/p>\n<p>&nbsp;<\/p>\n<p>\u5bf9\u4e8e\u6240\u6709\u7684\u9525\u578bNAT\uff0c\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.0.234:7890\uff09\u5bf9\u5916\u53d1\u9001\u7684\u6570\u636e\u65f6\uff0c\u7f51\u5173\u5730\u5740\u8f6c\u6362\u7684\u5730\u5740\u90fd\u662f\u4e00\u6837\u7684\u4e3a\uff08112.93.116.102:6834\uff09,\u90a3\u4e3a\u4ec0\u4e48\u5728\u56fe4 \u9650\u5236\u578b\u9525\u5f62NAT\u4e2d\uff0c\u5ba2\u6237\u7a0b\u5e8f\u4e0d\u80fd\u6536\u5230\u670d\u52a1\u7a0b\u5e8fB\uff0813.44.178.98:9801\uff09\u7684\u6570\u636e\u5462\uff1f\u56e0\u4e3a\u5728\u7f51\u5173\u4e2d\u6ca1\u6709\u53d1\u751f\u8fc7\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.0.234:7890\uff09\u7ed9\u670d\u52a1\u7a0b\u5e8fB\uff0813.44.178.98:9801\uff09\uff0c\u6545\u670d\u52a1\u7a0b\u5e8f\uff0813.44.178.98:9801\uff09\u76f4\u63a5\u53d1\u9001\u7ed9\u7f51\u5173\uff08112.93.116.102:6834\uff09\uff0c\u5219\u88ab\u7f51\u5173\u6240\u4e22\u5f03\u3002<\/p>\n<p><a href=\"https:\/\/s4.51cto.com\/wyfs02\/M01\/07\/49\/wKiom1nGkhCjX6CuAABYmhK5jE4855.png-wh_500x0-wm_3-wmp_4-s_2160276653.png\"><img loading=\"lazy\" decoding=\"async\" title=\"wKiom1nGkhCjX6CuAABYmhK5jE4855.png-wh_500x0-wm_3-wmp_4-s_2160276653\" src=\"https:\/\/aichh.com\/wp-content\/uploads\/2020\/08\/wKiom1nGkhCjX6CuAABYmhK5jE4855.png-wh_500x0-wm_3-wmp_4-s_2160276653.png\" width=\"500\" height=\"399\"><\/a><\/p>\n<p>\u56fe4 \u9650\u5236\u578b\u9525\u5f62NAT<\/p>\n<p>\u7b2c\u56db\u79cd\u5bf9\u79f0NAT\uff0c\u82f1\u6587\uff0c\u540d\u53ebSymmetric NAT\u3002\u5982\u56fe5\u5bf9\u79f0NAT\u6240\u793a\uff0c\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.0.234:7890\uff09\u53d1\u9001\u6570\u636e\u7ed9\u4e24\u4e2a\u4e0d\u540c\u670d\u52a1\u5668\uff0813.44.178.98:9800\uff09\u548c\uff08157.78.13.156:23456\uff09\u65f6\uff0c\u7f51\u5173\u4f1a\u8fdb\u884c\u4e0d\u540c\u7684\u7f51\u7edc\u5730\u5740\u6620\u5c04\u4ea7\u751f\uff08112.93.116.102:6834\uff09\u548c\uff08112.93.116.102:6835\uff09\u3002\u8fd9\u662f\u5bf9\u4e8e\u6574\u4e2aNAT\u7f51\u7edc\u53d1\u9001\u6570\u636e\u51fa\u53bb\u7684\u8fc7\u7a0b\uff0c\u800c\u63a5\u6536\u6570\u636e\u4e0e\u7aef\u53e3\u9650\u5236\u9525\u5f62NAT\u4e00\u81f4\u3002<\/p>\n<p><a href=\"https:\/\/s4.51cto.com\/wyfs02\/M01\/07\/49\/wKiom1nGkhCzHbmVAABstzph6sM258.png-wh_500x0-wm_3-wmp_4-s_3393758864.png\"><img loading=\"lazy\" decoding=\"async\" title=\"wKiom1nGkhCzHbmVAABstzph6sM258.png-wh_500x0-wm_3-wmp_4-s_3393758864\" src=\"https:\/\/aichh.com\/wp-content\/uploads\/2020\/08\/wKiom1nGkhCzHbmVAABstzph6sM258.png-wh_500x0-wm_3-wmp_4-s_3393758864.png\" width=\"500\" height=\"389\"><\/a><\/p>\n<p>\u56fe5 \u5bf9\u79f0NAT<\/p>\n<p>\u672c\u8282\u4ecb\u7ecd\u4e09\u79cd\u9525\u5f62NAT\u548c\u5bf9\u79f0NAT\u7684\u6982\u5ff5\uff0c\u76f8\u4fe1\u5230\u6b64\u4f60\u8fd8\u662f\u4e0d\u77e5\u9053NAT\u7c7b\u578b\u4e0e\u600e\u4e48\u7a7f\u900f\u7f51\u5173\u53cb\u4ec0\u4e48\u5173\u7cfb\u3002<\/p>\n<p>&nbsp;<\/p>\n<p>\u7a7f\u900f\u5256\u6790<\/p>\n<p>&nbsp;<\/p>\n<p>\u600e\u4e48\u7a7f\u900f\u7f51\u5173\u6765\u5b9e\u73b0\u53bb\u4e2d\u5fc3\u5316\uff0c\u5982\u56fe6\u7a7f\u900f\u7f51\u7edcNAT\u62d3\u6251\u56fe\u6240\u793a<\/p>\n<p><a href=\"https:\/\/s1.51cto.com\/wyfs02\/M00\/07\/49\/wKiom1nGkhDyDwdxAAB4Jpb2pAA676.png-wh_500x0-wm_3-wmp_4-s_482127532.png\"><img loading=\"lazy\" decoding=\"async\" title=\"wKiom1nGkhDyDwdxAAB4Jpb2pAA676.png-wh_500x0-wm_3-wmp_4-s_482127532\" src=\"https:\/\/aichh.com\/wp-content\/uploads\/2020\/08\/wKiom1nGkhDyDwdxAAB4Jpb2pAA676.png-wh_500x0-wm_3-wmp_4-s_482127532.png\" width=\"500\" height=\"389\"><\/a><\/p>\n<p>\u5728\u7406\u60f3\u7684\u60c5\u51b5\u4e0b\uff0c\u5728NAT 1\u4e2d\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.0.234:7890\uff09\u77e5\u9053NAT 2\u4e2d\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.2.168:2786\uff09\u7684\u7f51\u7edc\u6620\u5c04\u5730\u5740\uff08157.123.80.165:6954\uff09\uff0c\u5e76\u7ed9\u7f51\u7edc\u6620\u5c04\u5730\u5740\uff08157.123.80.165:6954\uff09\u53d1\u9001\u6570\u636e\uff0c\u5e76\u4e14\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.2.168:2786\uff09\u80fd\u591f\u6536\u5230\u6570\u636e\uff1b\u800cNAT 2\u4e2d\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.2.168:2786\uff09\u4e5f\u77e5\u9053NAT 1\u4e2d\u5ba2\u6237\u7a0b\u5e8f\u7684\u7f51\u7edc\u6620\u5c04\u5730\u5740\uff0c\u5e76\u7ed9\u5176\u7f51\u7edc\u6620\u5c04\u5730\u5740\uff08112.93.116.102:6834\uff09\u53d1\u9001\u6570\u636e\uff0c\u5e76\u4e14\u4e5f\u80fd\u6536\u5230\u6570\u636e\u3002\u6b64\u65f6\u5bf9\u4e8e\u670d\u52a1\u5668\u800c\u8a00\uff0c\u5c31\u5df2\u7ecf\u6ca1\u6709\u8d77\u5230\u6570\u636e\u4e2d\u8f6c\u7684\u4f5c\u7528\uff0c\u6b64\u65f6\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.0.234:7890\uff09\u4e0e\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.2.168:2786\uff09\u80fd\u591f\u4e92\u76f8\u6536\u53d1\u6570\u636e\uff0c\u670d\u52a1\u7a0b\u5e8f\uff0813.44.178.98:9800\uff09\u5df2\u7ecf\u6ca1\u6709\u4f5c\u7528\uff0c\u5bf9\u4e8e\u5ba2\u6237\u7aef\u7a0b\u5e8f\u6765\u8bf4\uff0c\u5df2\u7ecf\u5b9e\u73b0\u4e86\u53bb\u4e2d\u5fc3\u5316\u3002<\/p>\n<p>&nbsp;<\/p>\n<p>\u8fd9\u53ea\u662f\u5728\u7406\u8bba\u60c5\u51b5\uff0c\u73b0\u5728\u5177\u4f53\u5b9e\u73b0\u6b65\u9aa4\u4ee5\u53ca\u7ed3\u5408\u56db\u79cdNAT\u7c7b\u578b\u6765\u5206\u6790\u4e00\u4e0b\u3002<\/p>\n<p><strong>\u7b2c\u4e00\u79cd<\/strong>\uff1aNAT 1\u4e3a\u5b8c\u5168\u9525\u5f62NAT\uff0cNAT 2\u4e3a\u4efb\u4f55\u4e00\u79cdNAT\u6a21\u5f0f\uff0c\u5982\u56fe7 \u5b8c\u5168\u9525\u5f62NAT\u7684\u7a7f\u900f\uff0c\u7eff\u8272\u5b57\u4f53\u7684\u987a\u5e8f\u3002<\/p>\n<ol class=\"list-paddingleft-2\">\n<li>\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.0.234:7890\uff09\u5148\u53d1\u9001\u4e00\u4e2a\u8fde\u63a5\u8bf7\u6c42\u7ed9\u670d\u52a1\u7a0b\u5e8f\uff0c\u901a\u77e5\u670d\u52a1\u7a0b\u5e8f\uff0c\u9700\u8981\u8fde\u63a5\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.2.168:2786\uff09\u3002<\/li>\n<li>\u670d\u52a1\u7a0b\u5e8f\u6536\u5230\u8fde\u63a5\u8bf7\u6c42\u540e\uff0c\u53d1\u9001\u7ed9notify\u6d88\u606f\u7ed9\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.2.168:2786\uff09,\u901a\u77e5\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.2.168:2786\uff09\uff0c\u53d1\u9001p2p\u8fde\u63a5\u8bf7\u6c42\u7ed9\u7f51\u5173\uff08112.93.116.102:6834\uff09\u3002<\/li>\n<li>\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.2.168:2786\uff09\u53d1\u9001p2p\u8fde\u63a5\u8bf7\u6c42\u7ed9\u7f51\u5173\uff08112.93.116.102:6834\uff09\uff0c\u7531\u4e8eNAT1\u4e3a\u5b8c\u5168\u9525\u5f62NAT\uff0c\u6240\u4ee5\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.0.234:7890\uff09\u80fd\u591f\u6536\u5230\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.2.168:2786\uff09\u7684\u8bf7\u6c42\u3002<\/li>\n<li>\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.0.234:7890\uff09\u6536\u5230p2p\u8fde\u63a5\u8bf7\u6c42\u540e\uff0c\u4ece\u8bf7\u6c42\u6570\u636e\u4e2d\u89e3\u6790\u51fa\u8bf7\u6c42\u53d1\u9001\u8005\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.2.168:2786\uff09\u7684IP\u5730\u5740\u4e0e\u7aef\u53e3\uff0c\u5e76\u7acb\u5373\u8fd4\u56de\u786e\u8ba4\u6d88\u606f\u3002\u6b64\u65f6\u53cc\u65b9\u8fdb\u5165P2P\u7684\u7a7f\u900f\u6a21\u5f0f\u3002<\/li>\n<\/ol>\n<p>\u7136\u800c\u5728\u8fd9\u91cc\u6709\u4e00\u70b9\u9700\u8981\u6ce8\u610f\uff1aNAT2\u4e3a\u5bf9\u79f0NAT\u7684\u65f6\u5019\uff0c\u57283\u6b65\u9aa4\u7684\u65f6\u5019\uff0c\u7f51\u5173\u4f1a\u65b0\u751f\u6210\u53e6\u4e00\u4e2a\u7aef\u53e3\uff0cIP\u5730\u5740\u4e0d\u53d8\uff0c\u7528\u6765\u4e0eNAT1\u4e2d\u7684\u7f51\u7edc\u8fdb\u884c\u901a\u4fe1\uff1b\u57284\u6b65\u9aa4\u7684\u65f6\u5019\uff0c\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.0.234:7890\uff09\u8fd4\u56de\u6570\u636e\u7684\u5730\u5740\uff0c\u5c31\u662f\u65b0\u751f\u6210\u7684\u7aef\u53e3\u3002<\/p>\n<p><a href=\"https:\/\/s4.51cto.com\/wyfs02\/M01\/A5\/FA\/wKioL1nGkdejVvCGAACSBtVxl_E171.png-wh_500x0-wm_3-wmp_4-s_1164084917.png\"><img loading=\"lazy\" decoding=\"async\" title=\"wKioL1nGkdejVvCGAACSBtVxl_E171.png-wh_500x0-wm_3-wmp_4-s_1164084917\" src=\"https:\/\/aichh.com\/wp-content\/uploads\/2020\/08\/wKioL1nGkdejVvCGAACSBtVxl_E171.png-wh_500x0-wm_3-wmp_4-s_1164084917.png\" width=\"500\" height=\"389\"><\/a><\/p>\n<p>\u56fe7 \u5b8c\u5168\u9525\u5f62NAT\u7684\u7a7f\u900f<\/p>\n<p><strong>\u7b2c\u4e8c\u79cd<\/strong>\uff1aNAT 1\u4e3a\u9650\u5236\u9525\u5f62NAT\u6216\u8005\u7aef\u53e3\u9650\u5236\u9525\u5f62NAT\uff08\u4e24\u4e2a\u9525\u5f62NAT\u6a21\u5f0f\u662f\u4e00\u6837\u7684\uff0c\u5c31\u4e0d\u5206\u5f00\u89e3\u91ca\u4e86\uff09\uff0cNAT 2\u4e3a\u9525\u5f62NAT\u3002\u5982\u56fe8 \u9650\u5236\u9525\u5f62NAT\u7684\u7a7f\u900f\u6240\u793a<\/p>\n<ol class=\"list-paddingleft-2\">\n<li>\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.0.234:7890\uff09\u53d1\u9001\u8fde\u63a5\u8bf7\u6c42\u7ed9\u670d\u52a1\u7a0b\u5e8f\uff0c\u901a\u77e5\u670d\u52a1\u7a0b\u5e8f\uff0c\u9700\u8981\u8fde\u63a5\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.2.168:2786\uff09\u3002<\/li>\n<li>\u670d\u52a1\u7a0b\u5e8f\u6536\u5230\u8fde\u63a5\u8bf7\u6c42\u540e\uff0c\u53d1\u9001\u7ed9notify\u6d88\u606f\u7ed9\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.2.168:2786\uff09,\u901a\u77e5\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.2.168:2786\uff09\uff0c\u53d1\u9001p2p\u8fde\u63a5\u8bf7\u6c42\u7ed9\u7f51\u5173\uff08112.93.116.102:6834\uff09\u3002<\/li>\n<li>\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.2.168:2786\uff09\u53d1\u9001p2p\u8fde\u63a5\u8bf7\u6c42\u7ed9\u7f51\u5173\uff08112.93.116.102:6834\uff09\uff0c\u7531\u4e8eNAT1\u4e3a\u9650\u5236\u9525\u5f62NAT\uff0c\u6240\u4ee5\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.0.234:7890\uff09\u6536\u4e0d\u5230\u53d1\u9001\u7684p2p\u8fde\u63a5\u8bf7\u6c42\uff0c\u6b64\u6b65\u9aa4\u6700\u7ec8\u7684\u662f\u5728NAT2\u7684\u7f51\u5173\uff08157.123.80.165:6954\uff09\u65b0\u751f\u6210\u4e00\u6761NAT\u76ee\u7684\u5730\u5740\u7684\u8bb0\u5f55\u3002\u4e0e\u540e\u7eed6\u6b65\u9aa4\u4f5c\u4e3a\u914d\u5408\u3002<\/li>\n<li>\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.2.168:2786\uff09\u63d0\u9192\u670d\u52a1\u7a0b\u5e8f\u901a\u77e5\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.0.234:7890\uff09\uff0c<\/li>\n<li>\u670d\u52a1\u7a0b\u5e8f\u9a6c\u4e0a\u901a\u77e5\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.0.234:7890\uff09\u53d1\u9001\u8bf7\u6c42\u7ed9NAT2\u7684\u7f51\u5173\uff08157.123.80.165:6954\uff09\u3002<\/li>\n<li>\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.0.234:7890\uff09\u53d1\u9001p2p\u8fde\u63a5\u8bf7\u6c42\u7ed9\u7f51\u5173\uff08157.123.80.165:6954\uff09\uff0c\u7531\u4e8e\u521a\u521a3\u6b65\u9aa4\u53d1\u51fa\u4e86\u8bf7\u6c42\uff0c\u6b64\u65f6\u7f51\u5173\u4f1a\u8ba4\u4e3a\u662f3\u6b65\u9aa4\u8fd4\u56de\u7684\u54cd\u5e94\uff0c\u6240\u4ee5\u80fd\u591fp2p\u8fde\u63a5\u8bf7\u6c42\u53d1\u9001\u7ed9\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.2.168:2786\uff09<\/li>\n<li>\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.2.168:2786\uff09\u6536\u5230p2p\u8fde\u63a5\u8bf7\u6c42\u540e\uff0c\u7acb\u5373\u8fd4\u56de\u786e\u8ba4\u6d88\u606f\u7ed9p2p\u8fde\u63a5\u8bf7\u6c42\u5305\u89e3\u6790\u51fa\u6765\u7684IP\u5730\u5740\u4e0e\u7aef\u53e3\uff0c\u6b64\u786e\u8ba4\u6d88\u606f\u80fd\u591f\u987a\u5229\u5230\u5e95\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.0.234:7890\uff09\uff0c\u5230\u6b64\u7f51\u5173\u5df2\u7ecf\u7a7f\u900f\uff0cP2P\u5df2\u7ecf\u5efa\u7acb\u3002<\/li>\n<\/ol>\n<p><a href=\"https:\/\/s4.51cto.com\/wyfs02\/M02\/A5\/FA\/wKioL1nGkdiAKZ-cAAChO9RNALs726.png-wh_500x0-wm_3-wmp_4-s_3439009477.png\"><img loading=\"lazy\" decoding=\"async\" title=\"wKioL1nGkdiAKZ-cAAChO9RNALs726.png-wh_500x0-wm_3-wmp_4-s_3439009477\" src=\"https:\/\/aichh.com\/wp-content\/uploads\/2020\/08\/wKioL1nGkdiAKZ-cAAChO9RNALs726.png-wh_500x0-wm_3-wmp_4-s_3439009477.png\" width=\"500\" height=\"389\"><\/a><\/p>\n<p>\u56fe8 \u9650\u5236\u9525\u5f62NAT\u7684\u7a7f\u900f<\/p>\n<p><strong>\u7b2c\u4e09\u79cd<\/strong>\uff1aNAT1\u4e3a\u9650\u5236\u9525\u5f62NAT\uff0cNAT2\u4e3a\u5bf9\u79f0NAT\u3002\u5982\u56fe8\u9650\u5236\u9525\u5f62NAT\u7684\u7a7f\u900f\u6240\u793a\u3002<\/p>\n<p>\u5728\u6b65\u9aa43\u548c\u6b65\u9aa46\u4e0eNAT2\u4e3a\u9650\u5236\u9525\u5f62NAT\u6709\u4e9b\u5dee\u5f02\uff0c\u5176\u4f59\u6b65\u9aa4\u6d41\u7a0b\u4e00\u81f4\u3002<\/p>\n<p>\u6b65\u9aa43\uff1a\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.2.168:2786\uff09\u53d1\u9001p2p\u8fde\u63a5\u8bf7\u6c42\u7ed9\u7f51\u5173\uff08112.93.116.102:6834\uff09\uff0c\u7531\u4e8eNAT2\u4e3a\u5bf9\u79f0\u7f51\u7edc\uff0c\u6b64\u65f6\u4f1a\u91cd\u65b0\u751f\u6210\u4e00\u4e2a\u7aef\u53e3\u7528\u4e8e\u5bf9\u7f51\u5173\uff08112.93.116.102:6834\uff09\u901a\u4fe1\u3002\u65b0\u751f\u6210\u7684\u7aef\u53e3\u6ca1\u6709\u529e\u6cd5\u80fd\u591f\u51c6\u786e\u7684\u77e5\u9053\u3002\u53ea\u80fd\u8fdb\u884c\u731c\u6d4b\u3002<\/p>\n<p>\u6b65\u9aa46\uff1a\u53d1\u9001\u6570\u636e\u7ed9\u7f51\u5173\uff08157.123.80.165:\u731c\u6d4b\u7aef\u53e3\uff09\u3002<\/p>\n<p>\u5728\u8fd9\u91cc\u63d0\u4f9b\u4e00\u79cd\u601d\u8def\u6765\u63d0\u9ad8\u6d4b\u731c\u7684\u51c6\u786e\u5ea6\uff0c\u628a\u670d\u52a1\u7a0b\u5e8f\u4f7f\u7528\u4e24\u4e2a\u7aef\u53e3\uff08\u4e4b\u524d9800\uff0c\u65b0\u52a0\u4e00\u4e2a9801\uff09\uff0c\u7531\u4e8e\u7f51\u5173NAT\u5206\u914d\u7aef\u53e3\u662f\u987a\u5e8f\u7684\uff0c\u5728\u6b65\u9aa44\u53d1\u9001\u8bf7\u6c42\u7ed9\u670d\u52a1\u7a0b\u5e8f\uff089801\u7aef\u53e3\uff09\uff0c\u56e0\u4e3a\u6b65\u9aa43\u4e0e\u6b65\u9aa44\u76f8\u9694\u65f6\u95f4\u77ed\uff0c\u6b65\u9aa43\u5728\u7f51\u5173\uff08157.123.80.165\uff09\u6240\u751f\u6210\u7684\u65b0\u7aef\u53e3\u6bd4\u6b65\u9aa44\u7684\u7aef\u53e3\u5c0f\u3002\u4ece\u800c\u6765\u63d0\u9ad8\u731c\u6d4b\u7684\u51c6\u786e\u5ea6\u3002<\/p>\n<p>\u76f8\u4fe1\u5df2\u7ecf\u5bf9\u7a7f\u900f\u7684\u5177\u4f53\u6b65\u9aa4\u6709\u660e\u786e\u7684\u6982\u5ff5\uff0c\u600e\u4e48\u51c6\u786e\u7684\u5224\u65ad\u5f53\u524dNAT\u7684\u7c7b\u578b\uff1f<\/p>\n<p>&nbsp;<\/p>\n<p>NAT\u5206\u7c7b<\/p>\n<p>\u5176\u5b9e\u5728\u7f51\u7edc\u5730\u5740\u6620\u5c04\u6982\u5ff5\u5df2\u7ecf\u6709\u4ecb\u7ecd\u5206\u7c7b\uff0c\u5728\u8fd9\u91cc\u4f7f\u7528\u66f4\u52a0\u8ba1\u7b97\u673a\u5316\u8bed\u8a00\u63cf\u8ff0\u3002<\/p>\n<p><strong>\u7b2c\u4e00\u79cd<\/strong>\uff0c\u68c0\u6d4b\u5f53\u524d\u5ba2\u6237\u7a0b\u5e8f\u7684\u7f51\u5173\u662f\u5426\u4e3a\u5b8c\u5168\u9525\u5f62NAT\uff0c\u5982\u56fe9\u68c0\u6d4b\u5b8c\u5168\u9525\u5f62NAT\u6240\u793a<\/p>\n<p><a href=\"https:\/\/s4.51cto.com\/wyfs02\/M00\/A5\/FA\/wKioL1nGkdeyikmBAABxHWZavbg981.png-wh_500x0-wm_3-wmp_4-s_461412689.png\"><img loading=\"lazy\" decoding=\"async\" title=\"wKioL1nGkdeyikmBAABxHWZavbg981.png-wh_500x0-wm_3-wmp_4-s_461412689\" src=\"https:\/\/aichh.com\/wp-content\/uploads\/2020\/08\/wKioL1nGkdeyikmBAABxHWZavbg981.png-wh_500x0-wm_3-wmp_4-s_461412689.png\" width=\"500\" height=\"399\"><\/a><\/p>\n<p>\u56fe9 \u68c0\u6d4b\u5b8c\u5168\u9525\u5f62NAT<\/p>\n<p>\u9996\u5148\u68c0\u6d4bUdp\u7684\u53ef\u7528\u6027\uff0c\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.0.234:7890\uff09\u4f7f\u7528\u4e00\u4e2a300ms\u5b9a\u65f6\u5668\u53d1\u9001Udp\u8bf7\u6c42\u6570\u636e\u5305\u7ed9\u670d\u52a1\u5668A\u3002\u7b49\u5f85\u670d\u52a1\u5668A\u8fd4\u56de\u786e\u8ba4\u6570\u636e\u3002\u5982\u679c\u591a\u6b21\u53d1\u9001\u8bf7\u6c42\u5e76\u672a\u5f97\u5230\u670d\u52a1\u5668\u7684\u786e\u8ba4\u6570\u636e\uff0c\u5219\u8ba4\u4e3aUdp\u4e0d\u80fd\u4fe1\u606f\uff0c\u5219\u63a8\u51fa\u6574\u4e2a\u68c0\u6d4b\u8fc7\u7a0b\u3002\u5982\u679c\u6536\u5230\u786e\u8ba4\u6570\u636e\uff0c\u540c\u6837\u4f7f\u7528\u5b9a\u65f6\u5668\u518d\u53d1\u9001\u53e6\u4e00\u79cd\u8bf7\u6c42\u6570\u636e\u8981\u6c42\u670d\u52a1\u5668B\u53d1\u9001\u6570\u636e\u7ed9\u7f51\u5173\uff08112.93.116.102:6834\uff09\uff0c\u5982\u679c\u6536\u5230\u670d\u52a1\u5668B\u7684\u6570\u636e\uff0c\u5219\u8ba4\u4e3a\u662f\u5b8c\u5168\u9525\u5f62\u7f51\u7edc\u3002\u5982\u679c\u6ca1\u6709\u6536\u5230\u5219\u8fdb\u884c\u9650\u5236\u9525\u5f62NAT\u3002<\/p>\n<p>&nbsp;<\/p>\n<p><strong>\u7b2c\u4e8c\u79cd<\/strong>\uff0c\u68c0\u6d4b\u9650\u5236\u9525\u5f62\u7f51\u7edc\uff0c\u5982\u56fe10\u6240\u793a\u3002<\/p>\n<p><a href=\"https:\/\/s4.51cto.com\/wyfs02\/M02\/A5\/FA\/wKioL1nGkdeQXaSUAABtIOVt-Ik423.png-wh_500x0-wm_3-wmp_4-s_2165647245.png\"><img loading=\"lazy\" decoding=\"async\" title=\"wKioL1nGkdeQXaSUAABtIOVt-Ik423.png-wh_500x0-wm_3-wmp_4-s_2165647245\" src=\"https:\/\/aichh.com\/wp-content\/uploads\/2020\/08\/wKioL1nGkdeQXaSUAABtIOVt-Ik423.png-wh_500x0-wm_3-wmp_4-s_2165647245.png\" width=\"500\" height=\"399\"><\/a><\/p>\n<p>\u56fe10 \u68c0\u6d4b\u9650\u5236\u9525\u5f62NAT<\/p>\n<p>&nbsp;<\/p>\n<p>\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.0.234:7890\uff09\u5b9a\u65f6\u53d1\u9001\u6570\u636e\u5305\u7ed9\u670d\u52a1\u7a0b\u5e8fA\uff0c\u5e76\u8981\u6c42\u670d\u52a1\u7a0b\u5e8f\u4ece\u53e6\u4e00\u4e2a\u7aef\u53e3\u53d1\u9001\u6570\u636e\u5305\u7ed9\u7f51\u5173\uff08112.93.116.102:6834\uff09\u3002\u82e5\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.0.234:7890\uff09\u6536\u5230\u56de\u5e94\uff0c\u5219\u8be5NAT\u4e3a\u9650\u5236\u9525\u5f62NAT\u3002\u82e5\u591a\u6b21\u64cd\u4f5c\u6ca1\u6709\u56de\u5e94\uff0c\u5219\u8fdb\u884c\u5bf9\u79f0NAT\u68c0\u6d4b\u3002<\/p>\n<p>&nbsp;<\/p>\n<p><strong>\u7b2c\u4e09\u79cd<\/strong>\uff0c\u68c0\u6d4b\u5f53\u524d\u5ba2\u6237\u7a0b\u5e8f\u7684\u7f51\u5173\u662f\u5426\u4e3a\u5bf9\u79f0NAT\uff0c\u5982\u56fe9\u6240\u793a<\/p>\n<p>\u5ba2\u6237\u7a0b\u5e8f\uff08192.168.0.234:7890\uff09\u7ed9\u670d\u52a1\u5668A\uff0813.44.178.98:9800\uff09\u4e0e\u670d\u52a1\u5668B\uff08157.78.13.156:23456\uff09\u53d1\u9001\u6570\u636e\u5305\uff0c\u5bf9\u6bd4\u4e24\u4e2a\u670d\u52a1\u5668\u6536\u5230\u5ba2\u6237\u7a0b\u5e8f\u7684\uff08\uff09IP\u5730\u5740\u4e0e\u7aef\u53e3\u662f\u5426\u4e00\u81f4\u3002\u5982\u679c\u4e0d\u4e00\u81f4\u5219\u662f\u5bf9\u79f0\u7f51\u7edc\u3002\u5982\u679c\u4e00\u81f4\u5219\u8be5\u7f51\u7edc\u4e3a\u7aef\u53e3\u9650\u5236\u9525\u5f62NAT\u3002<\/p>\n<p>\u4ee5\u4e0b\u4e3a\u5b9e\u73b0\u4e86\u5b8c\u5168\u9525\u5f62\u7f51\u7edc\u7684\u7a7f\u900f\u4ee3\u7801<\/p>\n<p>udp.h<\/p>\n<pre>\/*\r\n * Author: WangBoJing\r\n * email: 1989wangbojing@gmail.com \r\n * github: https:\/\/github.com\/wangbojing\r\n *\/\r\n\r\n#ifndef __UDP_H__\r\n#define __UDP_H__\r\n\r\n#include &lt;stdio.h&gt;\r\n#include &lt;stdlib.h&gt;\r\n#include &lt;string.h&gt;\r\n#include &lt;sys\/socket.h&gt;\r\n#include &lt;netinet\/in.h&gt;\r\n#include &lt;unistd.h&gt;\r\n#include &lt;time.h&gt;\r\n\r\n\r\ntypedef unsigned int U32;\r\ntypedef unsigned short U16;\r\ntypedef unsigned char U8;\r\ntypedef volatile long UATOMIC;\r\ntypedef void* (*KING_CALLBACK)(void *arg);\r\n\r\n\r\ntypedef enum {\r\n KING_RESULT_FAILED = -1,\r\n KING_RESULT_SUCCESS = 0,\r\n} KING_RESULT;\r\n\r\n\r\ntypedef enum {\r\n KING_STATUS_NULL,\r\n KING_STATUS_LOGIN,\r\n KING_STATUS_HEARTBEAT,\r\n KING_STATUS_CONNECT,\r\n KING_STATUS_MESSAGE,\r\n KING_STATUS_NOTIFY,\r\n KING_STATUS_P2P_CONNECT,\r\n KING_STATUS_P2P_MESSAGE,\r\n} KING_STATUS_SET;\r\n\r\n\r\n#define KING_CLIENT_MAX    1024\r\n#define KING_CLIENT_ADDR_LENGTH  6\r\n\r\n#define KING_BUFFER_LENGTH  512\r\n#define KING_NUMBER_ID_LENGTH   4\r\n\r\n\r\ntypedef struct _CLIENT_TABLE {\r\n U8 addr[KING_CLIENT_ADDR_LENGTH]; \r\n U32 client_id;\r\n long stamp;\r\n} client_table;\r\n\r\n\/**************************** status define ****************************\/\r\n\r\n#define KING_PROTO_LOGIN_REQ    0x01\r\n#define KING_PROTO_LOGIN_ACK    0x81\r\n\r\n#define KING_PROTO_HEARTBEAT_REQ   0x02\r\n#define KING_PROTO_HEARTBEAT_ACK   0x82\r\n\r\n#define KING_PROTO_CONNECT_REQ    0x11\r\n#define KING_PROTO_CONNECT_ACK    0x91\r\n#define NTY_PROTO_NOTIFY_REQ    0x12\r\n#define NTY_PROTO_NOTIFY_ACK    0x92\r\n#define NTY_PROTO_P2P_CONNECT_REQ   0x13\r\n#define NTY_PROTO_P2P_CONNECT_ACK   0x93\r\n#define NTY_RPORO_MESSAGE_REQ    0x21\r\n#define NTY_RPORO_MESSAGE_ACK    0xA1\r\n\r\n\/**************************** context define ****************************\/\r\n#define KING_PROTO_BUFFER_VERSION_IDX  0\r\n#define KING_PROTO_BUFFER_STATUS_IDX  1\r\n#define KING_PROTO_BUFFER_LENGTH_IDX  (KING_PROTO_BUFFER_STATUS_IDX+1)\r\n#define KING_PROTO_BUFFER_SELFID_IDX  (KING_PROTO_BUFFER_LENGTH_IDX+2)\r\n\r\n\/\/login\r\n#define KING_PROTO_LOGIN_SELFID_IDX   KING_PROTO_BUFFER_SELFID_IDX\r\n\r\n\/\/heartbeat\r\n#define KING_PROTO_HEARTBEAT_SELFID_IDX  KING_PROTO_BUFFER_SELFID_IDX\r\n\r\n\/\/connect\r\n#define KING_PROTO_CONNECT_SELFID_IDX  KING_PROTO_BUFFER_SELFID_IDX\r\n#define KING_PROTO_CONNECT_OTHERID_IDX  (KING_PROTO_BUFFER_SELFID_IDX+KING_NUMBER_ID_LENGTH)\r\n\r\n\/\/notify\r\n#define KING_PROTO_NOTIFY_SELFID_IDX   KING_PROTO_BUFFER_SELFID_IDX\r\n#define KING_PROTO_NOTIFY_ADDR_IDX   (KING_PROTO_BUFFER_SELFID_IDX+KING_NUMBER_ID_LENGTH)\r\n\r\n\/\/p2p connect\r\n#define KING_PROTO_P2P_CONNECT_SELFID_IDX KING_PROTO_BUFFER_SELFID_IDX\r\n\r\n\/\/p2p connect ack\r\n#define KING_PROTO_P2P_CONNECT_ACK_SELFID_IDX KING_PROTO_BUFFER_SELFID_IDX\r\n\r\n\/\/message\r\n#define KING_RPORO_MESSAGE_SELFID_IDX  KING_PROTO_BUFFER_SELFID_IDX\r\n#define KING_PROTO_MESSAGE_OTHERID_IDX  (KING_RPORO_MESSAGE_SELFID_IDX+KING_NUMBER_ID_LENGTH)\r\n#define KING_RPORO_MESSAGE_CONTENT_IDX  (KING_PROTO_MESSAGE_OTHERID_IDX+KING_NUMBER_ID_LENGTH)\r\n\/\/message ack\r\n#define KING_RPORO_MESSAGE_ACK_SELFID_IDX KING_PROTO_BUFFER_SELFID_IDX\r\n\r\n\r\nstatic unsigned long cmpxchg(UATOMIC *addr, unsigned long _old, unsigned long _new) {\r\n U8 res;\r\n __asm__ volatile (\r\n        \"lock; cmpxchg %3, %1;sete %0;\"\r\n        : \"=a\" (res)\r\n        : \"m\" (*addr), \"a\" (_old), \"r\" (_new)\r\n        : \"cc\", \"memory\");\r\n return res;\r\n}\r\n\r\nstatic long time_genrator(void) {\r\n static long lTimeStamp = 0;\r\n static long timeStampMutex = 0;\r\n if(cmpxchg(&amp;timeStampMutex, 0, 1)) {\r\n  lTimeStamp = time(NULL);\r\n  timeStampMutex = 0;\r\n }\r\n return lTimeStamp;\r\n}\r\n\r\nstatic int addr_to_array(U8 *array, struct sockaddr_in *p_addr) {\r\n int i = 0;\r\n for (i = 0;i &lt; 4;i ++) {\r\n  array[i] = *((unsigned char*)(&amp;p_addr-&gt;sin_addr.s_addr) + i);\r\n }\r\n for (i = 0;i &lt; 2;i ++) {\r\n  array[4+i] = *((unsigned char*)(&amp;p_addr-&gt;sin_port)+i);\r\n }\r\n}\r\n\r\n\r\nstatic int array_to_addr(U8 *array, struct sockaddr_in *p_addr) {\r\n int i = 0;\r\n \r\n for (i = 0;i &lt; 4;i ++) {\r\n  *((unsigned char*)(&amp;p_addr-&gt;sin_addr.s_addr) + i) = array[i];\r\n }\r\n for (i = 0;i &lt; 2;i ++) {\r\n  *((unsigned char*)(&amp;p_addr-&gt;sin_port)+i) = array[4+i];\r\n }\r\n}\r\n\r\n\r\nstatic int king_send_login(int sockfd, int self_id, struct sockaddr_in *paddr) {\r\n\r\n U8 buffer[KING_BUFFER_LENGTH] = {0};\r\n \r\n buffer[KING_PROTO_BUFFER_STATUS_IDX] = KING_PROTO_LOGIN_REQ;\r\n *(int *)(buffer+KING_PROTO_LOGIN_SELFID_IDX) = self_id;\r\n int n = KING_PROTO_LOGIN_SELFID_IDX + KING_NUMBER_ID_LENGTH;\r\n \r\n n = sendto(sockfd, buffer, n, 0, (struct sockaddr*)paddr, sizeof(struct sockaddr_in));\r\n if (n &lt; 0) {\r\n  perror(\"sendto\");\r\n }\r\n \r\n return n;\r\n}\r\n\r\n\r\nstatic int king_send_heartbeat(int sockfd, int self_id, struct sockaddr_in *paddr) {\r\n \r\n U8 buffer[KING_BUFFER_LENGTH] = {0};\r\n \r\n buffer[KING_PROTO_BUFFER_STATUS_IDX] = KING_PROTO_HEARTBEAT_REQ;\r\n *(int *)(buffer+KING_PROTO_HEARTBEAT_SELFID_IDX) = self_id;\r\n int n = KING_PROTO_HEARTBEAT_SELFID_IDX + KING_NUMBER_ID_LENGTH;\r\n \r\n n = sendto(sockfd, buffer, n, 0, (struct sockaddr*)paddr, sizeof(struct sockaddr_in));\r\n if (n &lt; 0) {\r\n  perror(\"sendto\");\r\n }\r\n \r\n return n;\r\n}\r\n\r\n\r\nstatic int king_send_connect(int sockfd, int self_id, int other_id, struct sockaddr_in *paddr) {\r\n \r\n U8 buffer[KING_BUFFER_LENGTH] = {0};\r\n \r\n buffer[KING_PROTO_BUFFER_STATUS_IDX] = KING_PROTO_CONNECT_REQ;\r\n *(int *)(buffer+KING_PROTO_CONNECT_SELFID_IDX) = self_id;\r\n *(int *)(buffer+KING_PROTO_CONNECT_OTHERID_IDX) = other_id;\r\n int n = KING_PROTO_CONNECT_OTHERID_IDX + KING_NUMBER_ID_LENGTH;\r\n \r\n n = sendto(sockfd, buffer, n, 0, (struct sockaddr*)paddr, sizeof(struct sockaddr_in));\r\n if (n &lt; 0) {\r\n  perror(\"sendto\");\r\n }\r\n \r\n return n; \r\n}\r\n\r\n\r\nstatic int king_send_p2pconnect(int sockfd, int self_id, struct sockaddr_in *paddr) {\r\n U8 buffer[KING_BUFFER_LENGTH] = {0};\r\n \r\n buffer[KING_PROTO_BUFFER_STATUS_IDX] = NTY_PROTO_P2P_CONNECT_REQ;\r\n *(int *)(buffer+KING_PROTO_P2P_CONNECT_SELFID_IDX) = self_id;\r\n int n = KING_PROTO_P2P_CONNECT_SELFID_IDX + KING_NUMBER_ID_LENGTH;\r\n \r\n n = sendto(sockfd, buffer, n, 0, (struct sockaddr*)paddr, sizeof(struct sockaddr_in));\r\n if (n &lt; 0) {\r\n  perror(\"sendto\");\r\n }\r\n \r\n return n;\r\n}\r\n\r\n\r\nstatic int king_send_p2pconnectack(int sockfd, int self_id, struct sockaddr_in *paddr) {\r\n \r\n U8 buffer[KING_BUFFER_LENGTH] = {0};\r\n \r\n buffer[KING_PROTO_BUFFER_STATUS_IDX] = NTY_PROTO_P2P_CONNECT_ACK;\r\n *(int *)(buffer+KING_PROTO_P2P_CONNECT_ACK_SELFID_IDX) = self_id;\r\n int n = KING_PROTO_P2P_CONNECT_ACK_SELFID_IDX + KING_NUMBER_ID_LENGTH;\r\n \r\n n = sendto(sockfd, buffer, n, 0, (struct sockaddr*)paddr, sizeof(struct sockaddr_in));\r\n if (n &lt; 0) {\r\n  perror(\"sendto\");\r\n }\r\n \r\n return n;\r\n}\r\n\r\n\r\n\r\nstatic int king_client_send_message(int sockfd, int self_id, int other_id, struct sockaddr_in *paddr, U8 *msg, int length) {\r\n \r\n U8 buffer[KING_BUFFER_LENGTH] = {0};\r\n \r\n buffer[KING_PROTO_BUFFER_STATUS_IDX] = NTY_RPORO_MESSAGE_REQ; \r\n *(int *)(buffer+KING_RPORO_MESSAGE_SELFID_IDX) = self_id;\r\n *(int *)(buffer+KING_PROTO_MESSAGE_OTHERID_IDX) = other_id;\r\n \r\n memcpy(buffer+KING_RPORO_MESSAGE_CONTENT_IDX, msg, length);\r\n int n = KING_RPORO_MESSAGE_CONTENT_IDX + length;\r\n *(U16*)(buffer+KING_PROTO_BUFFER_LENGTH_IDX) = (U16) n;\r\n \r\n n = sendto(sockfd, buffer, n, 0, (struct sockaddr*)paddr, sizeof(struct sockaddr_in));\r\n if (n &lt; 0) {\r\n  perror(\"sendto\");\r\n }\r\n return n;\r\n}\r\nstatic int king_send_messageack(int sockfd, int self_id, struct sockaddr_in *paddr) {\r\n \r\n U8 buffer[KING_BUFFER_LENGTH] = {0};\r\n \r\n buffer[KING_PROTO_BUFFER_STATUS_IDX] = NTY_RPORO_MESSAGE_ACK;\r\n *(int *)(buffer+KING_RPORO_MESSAGE_ACK_SELFID_IDX) = self_id;\r\n int n = KING_RPORO_MESSAGE_ACK_SELFID_IDX + KING_NUMBER_ID_LENGTH;\r\n \r\n n = sendto(sockfd, buffer, n, 0, (struct sockaddr*)paddr, sizeof(struct sockaddr_in));\r\n if (n &lt; 0) {\r\n  perror(\"sendto\");\r\n }\r\n \r\n return n;\r\n}\r\n\r\n\r\nclient_table table[KING_CLIENT_MAX] = {0};\r\nint client_count = 0;\r\n\r\nstatic int get_index_by_clientid(int client_id) {\r\n\r\n int i = 0;\r\n int now_count = client_count;\r\n \r\n for (i = 0;i &lt; now_count;i ++) {\r\n  if (table[i].client_id == client_id) return i;\r\n }\r\n \r\n}\r\n\r\nstatic int king_send_message(int sockfd, int client_id, U8 *buffer, int length) {\r\n \r\n int index = get_index_by_clientid(client_id);\r\n \r\n struct sockaddr_in c_addr;\r\n c_addr.sin_family = AF_INET;\r\n array_to_addr(table[index].addr, &amp;c_addr);\r\n \r\n int n = sendto(sockfd, buffer, length, 0, (struct sockaddr*)&amp;c_addr, sizeof(c_addr));\r\n if (n &lt; 0) {\r\n  perror(\"sendto\");\r\n }\r\n return n;\r\n}\r\n\r\nstatic int king_send_notify(int sockfd, int client_id, int self_id) {\r\n\r\n U8 buffer[KING_BUFFER_LENGTH] = {0};\r\n int index = get_index_by_clientid(self_id);\r\n \r\n buffer[KING_PROTO_BUFFER_STATUS_IDX] = NTY_PROTO_NOTIFY_REQ;\r\n *(int*)(buffer+KING_PROTO_NOTIFY_SELFID_IDX) = self_id;\r\n memcpy(buffer+KING_PROTO_NOTIFY_ADDR_IDX, table[index].addr, KING_CLIENT_ADDR_LENGTH);\r\n \r\n index = get_index_by_clientid(client_id);\r\n struct sockaddr_in c_addr;\r\n c_addr.sin_family = AF_INET;\r\n array_to_addr(table[index].addr, &amp;c_addr);\r\n int n = KING_PROTO_NOTIFY_ADDR_IDX + KING_CLIENT_ADDR_LENGTH;\r\n \r\n n = sendto(sockfd, buffer, n, 0, (struct sockaddr*)&amp;c_addr, sizeof(c_addr));\r\n if (n &lt; 0) {\r\n  perror(\"sendto\");\r\n }\r\n return n;\r\n}\r\n\r\n\r\n#endif<\/pre>\n<p>udp_client.c<\/p>\n<pre>\/*\r\n * Author: WangBoJing\r\n * email: 1989wangbojing@gmail.com \r\n * github: https:\/\/github.com\/wangbojing\r\n *\/\r\n#include \"udp.h\"\r\n#include &lt;pthread.h&gt;\r\n\r\nstatic int status_machine = KING_STATUS_LOGIN;\r\nstatic int client_selfid = 0x0;\r\n\r\nstruct sockaddr_in server_addr;\r\n\r\nclient_table p2p_clients[KING_CLIENT_MAX] = {0};\r\nstatic int p2p_count = 0;\r\n\r\nstatic int king_client_buffer_parser(int sockfd, U8 *buffer, U32 length, struct sockaddr_in *addr) {\r\n \r\n U8 status = buffer[KING_PROTO_BUFFER_STATUS_IDX];\r\n \r\n switch (status) {\r\n  case NTY_PROTO_NOTIFY_REQ: {\r\n  \r\n   struct sockaddr_in other_addr;\r\n   other_addr.sin_family = AF_INET;\r\n   \r\n   array_to_addr(buffer+KING_PROTO_NOTIFY_ADDR_IDX, &amp;other_addr);\r\n   king_send_p2pconnect(sockfd, client_selfid, &amp;other_addr);\r\n   \r\n   break;\r\n  }\r\n  case NTY_PROTO_P2P_CONNECT_REQ: {\r\n  \r\n   int now_count = p2p_count++;\r\n   p2p_clients[now_count].stamp = time_genrator();\r\n   \r\n   p2p_clients[now_count].client_id = *(int*)(buffer+KING_PROTO_P2P_CONNECT_SELFID_IDX);\r\n   addr_to_array(p2p_clients[now_count].addr, addr);\r\n  \r\n   king_send_p2pconnectack(sockfd, client_selfid, addr);\r\n   printf(\"Enter P2P Modeln\");\r\n   status_machine = KING_STATUS_P2P_MESSAGE;\r\n   \r\n   break;\r\n  }\r\n  case NTY_PROTO_P2P_CONNECT_ACK: {\r\n  \r\n   int now_count = p2p_count++;\r\n   \r\n   p2p_clients[now_count].stamp = time_genrator();\r\n   p2p_clients[now_count].client_id = *(int*)(buffer+KING_PROTO_P2P_CONNECT_SELFID_IDX);\r\n   addr_to_array(p2p_clients[now_count].addr, addr);\r\n   \r\n   printf(\"Enter P2P Modeln\");\r\n   status_machine = KING_STATUS_P2P_MESSAGE;\r\n   \r\n   break;\r\n  }\r\n  case NTY_RPORO_MESSAGE_REQ: {\r\n  \r\n   U8 *msg = buffer+KING_RPORO_MESSAGE_CONTENT_IDX;\r\n   U32 other_id = *(U32*)(buffer+KING_RPORO_MESSAGE_SELFID_IDX);\r\n   \r\n   printf(\" from client:%d --&gt; %sn\", other_id, msg);\r\n   king_send_messageack(sockfd, client_selfid, addr);\r\n   \/\/status_machine = KING_STATUS_P2P_MESSAGE;\r\n   \r\n   break;\r\n  }\r\n  case KING_PROTO_LOGIN_ACK: {\r\n  \r\n   printf(\" Connect Server SuccessnPlease Enter Message : \");\r\n   status_machine = KING_STATUS_MESSAGE;\r\n   \r\n   break;\r\n  }\r\n  case KING_PROTO_HEARTBEAT_ACK:\r\n  case KING_PROTO_CONNECT_ACK:\r\n  case NTY_PROTO_NOTIFY_ACK:\r\n   break;\r\n  case NTY_RPORO_MESSAGE_ACK:\r\n   break;\r\n }\r\n \r\n}\r\n\r\nvoid* king_recv_callback(void *arg) {\r\n\r\n int sockfd = *(int *)arg;\r\n struct sockaddr_in addr;\r\n int length = sizeof(struct sockaddr_in);\r\n U8 buffer[KING_BUFFER_LENGTH] = {0};\r\n \/\/printf(\"king_recv_callback --&gt; entern\");\r\n \r\n while (1) {\r\n \r\n  int n = recvfrom(sockfd, buffer, KING_BUFFER_LENGTH, 0, (struct sockaddr*)&amp;addr, &amp;length);\r\n  if (n &gt; 0) {\r\n  \r\n   buffer[n] = 0;\r\n   king_client_buffer_parser(sockfd, buffer, n, &amp;addr);\r\n   \r\n  } else if (n == 0) {\r\n   printf(\"server closedn\");\r\n   close(sockfd);\r\n   break;\r\n  } else if (n == -1) {\r\n   perror(\"recvfrom\");\r\n   close(sockfd);\r\n   break;\r\n  }\r\n }\r\n}\r\n\r\nvoid *king_send_callback(void *arg) {\r\n\r\n int sockfd = *(int *)arg;\r\n char buffer[KING_BUFFER_LENGTH] = {0};\r\n \/\/printf(\"king_send_callback --&gt; entern\");\r\n \r\n while (1) {\r\n  bzero(buffer, KING_BUFFER_LENGTH);\r\n  \r\n  scanf(\"%s\", buffer);\r\n  \/\/getchar();\r\n  if (status_machine == KING_STATUS_MESSAGE) {\r\n   \r\n   printf(\" --&gt; please enter bt : \");\r\n   \r\n   int other_id = buffer[1]-0x30;\r\n   if (buffer[0] == 'C') {\r\n   \r\n    king_send_connect(sockfd, client_selfid, other_id, &amp;server_addr);\r\n    \r\n   } else {\r\n   \r\n    int length = strlen(buffer);\r\n    king_client_send_message(sockfd, client_selfid, other_id, &amp;server_addr, buffer, length);\r\n   }\r\n  \r\n  } else if (status_machine == KING_STATUS_P2P_MESSAGE) {\r\n  \r\n   printf(\" --&gt; please enter message to send : \");\r\n   \r\n   int now_count = p2p_count;\r\n   struct sockaddr_in c_addr;\r\n   c_addr.sin_family = AF_INET;\r\n   array_to_addr(p2p_clients[now_count-1].addr, &amp;c_addr);\r\n    int length = strlen(buffer);\r\n   king_client_send_message(sockfd, client_selfid, 0, &amp;c_addr, buffer, length);\r\n   \r\n  }\r\n }\r\n}\r\n\r\nint main(int argc, char *argv[]) {\r\n\r\n printf(\" This is a UDP Clientn\");\r\n if (argc != 4) {\r\n  printf(\"Usage: %s ip portn\", argv[0]);\r\n  exit(1);\r\n }\r\n \r\n int sockfd = socket(AF_INET, SOCK_DGRAM, 0);\r\n if (sockfd &lt; 0) {\r\n  perror(\"socket\");\r\n  exit(1);\r\n }\r\n\r\n pthread_t thread_id[2] = {0};\r\n KING_CALLBACK cb[2] = {king_send_callback, king_recv_callback};\r\n \r\n int i = 0;\r\n for (i = 0;i &lt; 2;i ++) {\r\n  int ret = pthread_create(&amp;thread_id[i], NULL, cb[i], &amp;sockfd);\r\n  if (ret) {\r\n   perror(\"pthread_create\");\r\n   exit(1);\r\n  }\r\n  sleep(1);\r\n }\r\n \r\n server_addr.sin_family = AF_INET;\r\n server_addr.sin_port = htons(atoi(argv[2]));\r\n server_addr.sin_addr.s_addr = inet_addr(argv[1]);\r\n \r\n client_selfid = atoi(argv[3]);\r\n king_send_login(sockfd, client_selfid, &amp;server_addr);\r\n for (i = 0;i &lt; 2;i ++) {\r\n  pthread_join(thread_id[i], NULL);\r\n }\r\n \r\n return 0;\r\n}\r\n\r\n\r\nudp_server.c\r\n\r\n\/*\r\n * Author: WangBoJing\r\n * email: 1989wangbojing@gmail.com \r\n * github: https:\/\/github.com\/wangbojing\r\n *\/\r\n#include \"udp.h\"\r\n\r\nint king_buffer_parser(int sockfd, U8 *buffer, U32 length, struct sockaddr_in *addr) {\r\n \r\n U8 status = buffer[KING_PROTO_BUFFER_STATUS_IDX];\r\n printf(\"king_buffer_parser --&gt; %xn\", status);\r\n \r\n switch (status) {\r\n  case KING_PROTO_LOGIN_REQ: {\r\n#if 1\r\n   int old = client_count;\r\n   int now = old+1;\r\n   if(0 == cmpxchg((UATOMIC*)&amp;client_count, old, now)) { \r\n    printf(\"client_count --&gt; %d, old:%d, now:%dn\", client_count, old, now);\r\n    return KING_RESULT_FAILED;\r\n   }\r\n#else\r\n   client_count = client_count+1;\r\n   int now = client_count;\r\n#endif\r\n   U8 array[KING_CLIENT_ADDR_LENGTH] = {0};\r\n   addr_to_array(array, addr);\r\n   printf(\"login --&gt; %d.%d.%d.%d:%dn\", *(unsigned char*)(&amp;addr-&gt;sin_addr.s_addr), *((unsigned char*)(&amp;addr-&gt;sin_addr.s_addr)+1),             \r\n    *((unsigned char*)(&amp;addr-&gt;sin_addr.s_addr)+2), *((unsigned char*)(&amp;addr-&gt;sin_addr.s_addr)+3),             \r\n    addr-&gt;sin_port);\r\n   \r\n   table[now].client_id =  *(U32*)(buffer+KING_PROTO_LOGIN_SELFID_IDX);\r\n   memcpy(table[now].addr, array, KING_CLIENT_ADDR_LENGTH);\r\n   break;\r\n  }\r\n  case KING_PROTO_HEARTBEAT_REQ: {\r\n  \r\n   int client_id = *(unsigned int*)(buffer+KING_PROTO_HEARTBEAT_SELFID_IDX);\r\n   int index = get_index_by_clientid(client_id);\r\n   table[index].stamp = time_genrator();\r\n   \r\n   break;\r\n  }\r\n  case KING_PROTO_CONNECT_REQ: {\r\n  \r\n   int client_id = *(unsigned int*)(buffer+KING_PROTO_CONNECT_SELFID_IDX);\r\n   int other_id = *(unsigned int*)(buffer+KING_PROTO_CONNECT_OTHERID_IDX);\r\n   king_send_notify(sockfd, other_id, client_id);\r\n   \r\n   break;\r\n  }\r\n  case NTY_RPORO_MESSAGE_REQ: {\r\n  \r\n   U8 *msg = buffer+KING_RPORO_MESSAGE_CONTENT_IDX;\r\n   int client_id = *(unsigned int*)(buffer+KING_RPORO_MESSAGE_SELFID_IDX);\r\n   int other_id = *(unsigned int*)(buffer+KING_PROTO_MESSAGE_OTHERID_IDX);\r\n   \r\n   printf(\" from client:%d --&gt; %sn\", client_id, msg);\r\n#if 0\r\n   king_send_message(sockfd, other_id, buffer, length);\r\n#endif\r\n\r\n   break;\r\n  }\r\n }\r\n return KING_RESULT_SUCCESS;\r\n \r\n}\r\n\r\n\r\nint main(int argc, char *argv[]) {\r\n\r\n printf(\" This is a UDP Servern\");\r\n \r\n int sockfd = socket(AF_INET, SOCK_DGRAM, 0);\r\n if (sockfd &lt; 0) {\r\n  perror(\"socket\");\r\n  exit(0);\r\n }\r\n \r\n struct sockaddr_in addr;\r\n addr.sin_family = AF_INET;\r\n addr.sin_port = htons(atoi(argv[1]));\r\n addr.sin_addr.s_addr = htonl(INADDR_ANY);\r\n \r\n if (bind(sockfd, (struct sockaddr*)&amp;addr, sizeof(addr)) &lt; 0) {\r\n  perror(\"bind\");\r\n  exit(1);\r\n }\r\n \r\n char buffer[KING_BUFFER_LENGTH] = {0};\r\n struct sockaddr_in c_addr;\r\n \r\n int n;\r\n int length = sizeof(struct sockaddr_in);\r\n \r\n while(1) {\r\n  \r\n  n = recvfrom(sockfd, buffer, KING_BUFFER_LENGTH, 0, (struct sockaddr*)&amp;c_addr, &amp;length);\r\n  if (n &gt; 0) {\r\n  \r\n   buffer[n] = 0x0;\r\n   printf(\"%d.%d.%d.%d:%d say: %sn\", *(unsigned char*)(&amp;c_addr.sin_addr.s_addr), *((unsigned char*)(&amp;c_addr.sin_addr.s_addr)+1),             \r\n    *((unsigned char*)(&amp;c_addr.sin_addr.s_addr)+2), *((unsigned char*)(&amp;c_addr.sin_addr.s_addr)+3),             \r\n    c_addr.sin_port, buffer);\r\n   int ret = king_buffer_parser(sockfd, buffer, n, &amp;c_addr);\r\n   if (ret == KING_RESULT_FAILED) continue;\r\n\r\n   buffer[KING_PROTO_BUFFER_STATUS_IDX] += 0x80;\r\n   n = sendto(sockfd, buffer, n, 0, (struct sockaddr*)&amp;c_addr, sizeof(c_addr));\r\n   if (n &lt; 0) {\r\n    perror(\"sendto\");\r\n    break;\r\n   }\r\n  } else if (n == 0) {\r\n   printf(\"server closedn\");\r\n  } else {\r\n   perror(\"recv\");\r\n   break;\r\n  }\r\n }\r\n \r\n return 0;\r\n}<\/pre>\n<p>\u539f\u6587\u53c2\u8003:<br \/>\nhttps:\/\/github.com\/jflyup\/nat_traversal<br \/>\nhttps:\/\/blog.csdn.net\/bytxl\/article\/details\/34812293<br \/>\nhttp:\/\/blog.51cto.com\/wangbojing\/1968118<br \/>\nhttps:\/\/www.zhihu.com\/question\/20436734<\/p>\n<p>&nbsp;<\/p>\n<!--wp-compress-html no compression--><!--wp-compress-html-->","protected":false},"excerpt":{"rendered":"\u968f\u7740\u533a\u5757\u94fe\u7684\u8d8a\u6765\u8d8a\u706b\uff0c\u53bb\u4e2d\u5fc3\u5316\u7684\u7f51\u7edc\u8bbe\u8ba1\u518d\u6b21\u88ab\u62ff\u5230\u6280\u672f\u4eba\u5458\u9762\u524d\u3002\u5728\u8fd9\u91cc\u6211\u4f7f\u7528\u975e\u5e38\u901a\u4fd7\u7684\u8bed\u8a00\uff0c\u5e2e\u5927\u5bb6\u6765\u7406\u89e3\u53bb\u4e2d\u5fc3\u5316\u7684\u7f51\u7edc\u8bbe\u8ba1\u7684\u57fa\u7840\u2014\u7f51\u7edc\u7a7f\u900f\u3002\u518d\u4f7f\u7528\u4ee3\u7801\u6765\u5b9e\u73b0\u7a7f\u900f\u3002\u5982\u679c\u9610\u8ff0\u4e0d\u5230\u4f4d\u7684\u5730\u65b9\uff0c\u6b22\u8fce\u5927\u5bb6\u629b\u7816\u3002\u4ee3 \u00b7\u00b7\u00b7","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[168,169,132],"class_list":["post-717","post","type-post","status-publish","format-standard","hentry","category-jiaocheng","tag-168","tag-169","tag-132"],"views":107,"_links":{"self":[{"href":"https:\/\/aichh.com\/api\/wp\/v2\/posts\/717","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aichh.com\/api\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/aichh.com\/api\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/aichh.com\/api\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/aichh.com\/api\/wp\/v2\/comments?post=717"}],"version-history":[{"count":2,"href":"https:\/\/aichh.com\/api\/wp\/v2\/posts\/717\/revisions"}],"predecessor-version":[{"id":729,"href":"https:\/\/aichh.com\/api\/wp\/v2\/posts\/717\/revisions\/729"}],"wp:attachment":[{"href":"https:\/\/aichh.com\/api\/wp\/v2\/media?parent=717"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/aichh.com\/api\/wp\/v2\/categories?post=717"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/aichh.com\/api\/wp\/v2\/tags?post=717"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}