免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3930 | 回复: 6
打印 上一主题 下一主题

[算法] 求教,client与server之间协商(非标准)端口号的方法 [复制链接]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-02-21 21:59 |只看该作者 |倒序浏览
像80、443、22这种都还好,一般都不会被无端占用。。。  使用非标准端口号一般都是故意为之。。。
但1024以下的也不是全都很保险。。。 尤其是在Windows xp下, 1080经常被占。。。  有时候是ppap.exe, 有时候甚至是emacs的server-mode。。。

自己用这些软件时都还好, 看看错误信息就知道怎么排除, 虽然有时候得把正在加速的ppap给关了。。。
但如果要给非专业人士使用, 这不是个办法啊。。。

能想到的一些策略:

1. 完全手动的方式
server启动时报告: listening on XXX。 client启动时用一个参数选择这个端口和。
或者再稍微智能一些, 先约定一个默认的, 如果server启动时没被占用, client就可以少用一个参数。 比如ssh -p PORT。

2. 环境变量
比如ssh-agent。 但这个只能有父子关系的进程才行吧?

3. 文件
server和client约定一个文件位置, 里面放端口号。 比如emacs的server-mode或者clojure的nrepl。

有其他更"规范"一些的方式么。。。  一个专门存放service-name -> port-number的地方?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
2 [报告]
发表于 2013-02-21 22:18 |只看该作者
说两个具体的case吧。。。

先是emacs。 emacs监听了一个端口,其他客户程序可以发送数据给它, 在这个emacs的环境下执行一些代码。
有点类似emacsclient --eval, 但没有这么多限制。
比如可以等待emacs执行完代码后才退出, 用emacs合并文件时, 返回值是有用的。
比如可以让terminal里的emacs和桌面上的其他程序交换clipboard的数据。

嗯, 其实在本地terminal里用emacs的情况并不多。。。
目前新的问题是, 用ssh连vps, 并在远端上运行emacs。。。
用ssh -LLOCAL_PORT:REMOTE_HOST:REMOTE_PORT , 同样可以让remote的emacs和本地的emacs通信, 于是可以交换clipboarb
(这是最想解决的事情。。。 putty里复制粘贴太麻烦了, cmd.exe里复制粘贴更是丧心病狂。。。  尤其是文件内容超过一屏幕时, 只能老老实实scp了。。。)
但。。。  约定一个文件位置来交换端口号就很麻烦了啊。。。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
3 [报告]
发表于 2013-02-21 22:27 |只看该作者
另一个。。。  proxy。。。  都懂的。。。

如果proxy的端口号被占了。。。   通常我就是把占端口号的那个进程给关了。。。
否则要改多少浏览器 —— chrome, firefox, opera, safari, conkeror(emacs党推荐试试这个浏览器)的配置。。。

PAC也不行。 比如goagent的8086被占, 还是要去改PAC的端口号。  WPAD没试过。。。

论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:32:30
4 [报告]
发表于 2013-02-22 01:13 |只看该作者
内网机器间可以用ssdp,本机也可以的吧。

论坛徽章:
0
5 [报告]
发表于 2013-02-22 09:47 |只看该作者
回复 1# OwnWaterloo

本机自己跑程序,就去读配置文件吧,或者直接用fifo文件通信。

如果在公网上跑,就存在很多不确定性了。比如XP每次你侦听一个新端口,就蹦个对话框。或者有些环境,要求防火墙里设定端口。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
6 [报告]
发表于 2013-02-22 10:56 |只看该作者
意思就是你的服务是工作在一个著名的PORT上(<1024, 正常情况不会被占用), 但恰好某些贱人(QQ旋风)把这个PORT主动bind了.

这种情况我知道怎么办... 我犹记得做BT协议的时候, 作为一个P2P客户端是需要配置一个PORT RANGE的, 然后客户端启动监听P2P连接的端口时会在[min, max]间逐渐+1的bind, 直到成功, 然后将这个PORT报告给tracker服务器, 以便其他P2P客户端能够询问tracker然后连接该p2p客户端。

解决此类问题, 还是需要一个中心的meta server,HOHO。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
7 [报告]
发表于 2013-02-22 10:57 |只看该作者
如果不要meta server,也规定range, 然后让其他客户端在range里尝试连接各个port也可以, 并且需要一个应用层的握手来认证一下端口对不对。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP