求大神们解答一个 Python Socket 的问题

2017-06-09 15:04:54 +08:00
 ray1888
Python 作为客户端一方的程序,可以绑定一个端口去与客户端建立 Socket 连接吗?如果有,应该怎样绑定?求解答
3267 次点击
所在节点    Python
17 条回复
araraloren
2017-06-09 15:09:47 +08:00
只要对端有 程序监听端口,你就能连的上,那就是服务端。。
socket 在发起连接的时候可以自己绑定一个本地的端口,不知道你是不是指的这个。。
mhycy
2017-06-09 15:11:55 +08:00
发起请求之前先 bind 一个端口,这时候这个 socket 发起的请求会通过这个端口( ADDR:PORT )进行连接
ray1888
2017-06-09 15:16:50 +08:00
@mhycy 但是我 bind 之后连接会出现报错,报错信息是这样的,OSError: [WinError 10048] 通常每个套接字地址(协议 /网络地址 /端口)只允许使用一次。但是明明是没占用那个端口的
Cooky
2017-06-09 15:18:36 +08:00
换个端口或者 netstat 看看谁在用那个端口
mhycy
2017-06-09 15:19:32 +08:00
@ray1888 上代码看看
ray1888
2017-06-09 15:34:54 +08:00
lport = 3000
serverport = self.conn.recv(1024)
serverport = int(serverport)
self.tunnel_sock = socket.socket() #此处 tunnel_sock 为主动模式下的数据通道
self.tunnel_sock.bind((laddr, lport))
self.tunnel_sock.connect((chost, serverport))
self.tunnel_sock.send(b"active mode tunnel has been started")

报错:
OSError: [WinError 10048] 通常每个套接字地址(协议 /网络地址 /端口)只允许使用一次。

但是我用 windows,和 linux 的虚拟机建立 socket 是没问题的,也是这样。在 windows 自己尝试就不行,netstat 过端口并没有被占用
am241
2017-06-09 15:39:44 +08:00
直接 connect 就行,不用 bind
am241
2017-06-09 15:40:59 +08:00
好像 udp 才需要 bind,tcp 连接不需要
ray1888
2017-06-09 15:42:22 +08:00
@am241 我的目的是客户端绑定一个端口和服务器进行连接。所以是要 bind 的
cute
2017-06-09 16:54:40 +08:00
不需要 bind
araraloren
2017-06-09 17:00:21 +08:00
@ray1888 你绑定本地端口是有什么特殊需求吗?没有特殊需要无需绑定本地端口,系统会自动选择一个的

@am241 在客户端模式下 udp tcp 都不需要手动 bind 端口
ray1888
2017-06-09 17:08:43 +08:00
@araraloren 是有特殊需求,想写一个 FTP 服务器,FTP 的主动模式需要服务器绑定 20 端口然后主动与客户端进行连接
araraloren
2017-06-09 17:15:55 +08:00
@ray1888 那你就得注意,没有其他程序使用 20 端口,你的程序有权限使用 20 端口,20 端口是一个特权端口,不是普通端口,你可能需要相应的权限才行
denonw
2017-06-09 17:19:30 +08:00
印象中不需要 bind 的吧?
ray1888
2017-06-09 17:35:15 +08:00
@araraloren 在 windows 下面已经 netstat 过,20 端口并没有占用,但是就是不能这样绑定,权限已经是管理员权限
hsmocc
2017-06-10 00:56:25 +08:00
不知道是不是需要设置 self.tunnel_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1),lz 可以试试
ray1888
2017-06-12 10:33:30 +08:00
@hsmocc 其实不是,是我在两个类里面的引用对象是否有绑定,如果再被调用的类中调用了本类中的属性,会无法绑定,导致之前创建的 socket 关闭不成功

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/367233

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX