V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
ray1888
V2EX  ›  Python

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

  •  1
     
  •   ray1888 ·
    ray1888 · 2017-06-09 15:04:54 +08:00 · 3234 次点击
    这是一个创建于 2484 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Python 作为客户端一方的程序,可以绑定一个端口去与客户端建立 Socket 连接吗?如果有,应该怎样绑定?求解答
    17 条回复    2017-06-12 10:33:30 +08:00
    araraloren
        1
    araraloren  
       2017-06-09 15:09:47 +08:00
    只要对端有 程序监听端口,你就能连的上,那就是服务端。。
    socket 在发起连接的时候可以自己绑定一个本地的端口,不知道你是不是指的这个。。
    mhycy
        2
    mhycy  
       2017-06-09 15:11:55 +08:00
    发起请求之前先 bind 一个端口,这时候这个 socket 发起的请求会通过这个端口( ADDR:PORT )进行连接
    ray1888
        3
    ray1888  
    OP
       2017-06-09 15:16:50 +08:00
    @mhycy 但是我 bind 之后连接会出现报错,报错信息是这样的,OSError: [WinError 10048] 通常每个套接字地址(协议 /网络地址 /端口)只允许使用一次。但是明明是没占用那个端口的
    Cooky
        4
    Cooky  
       2017-06-09 15:18:36 +08:00 via Android
    换个端口或者 netstat 看看谁在用那个端口
    mhycy
        5
    mhycy  
       2017-06-09 15:19:32 +08:00
    @ray1888 上代码看看
    ray1888
        6
    ray1888  
    OP
       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
        7
    am241  
       2017-06-09 15:39:44 +08:00 via Android
    直接 connect 就行,不用 bind
    am241
        8
    am241  
       2017-06-09 15:40:59 +08:00 via Android
    好像 udp 才需要 bind,tcp 连接不需要
    ray1888
        9
    ray1888  
    OP
       2017-06-09 15:42:22 +08:00
    @am241 我的目的是客户端绑定一个端口和服务器进行连接。所以是要 bind 的
    cute
        10
    cute  
       2017-06-09 16:54:40 +08:00
    不需要 bind
    araraloren
        11
    araraloren  
       2017-06-09 17:00:21 +08:00
    @ray1888 你绑定本地端口是有什么特殊需求吗?没有特殊需要无需绑定本地端口,系统会自动选择一个的

    @am241 在客户端模式下 udp tcp 都不需要手动 bind 端口
    ray1888
        12
    ray1888  
    OP
       2017-06-09 17:08:43 +08:00
    @araraloren 是有特殊需求,想写一个 FTP 服务器,FTP 的主动模式需要服务器绑定 20 端口然后主动与客户端进行连接
    araraloren
        13
    araraloren  
       2017-06-09 17:15:55 +08:00
    @ray1888 那你就得注意,没有其他程序使用 20 端口,你的程序有权限使用 20 端口,20 端口是一个特权端口,不是普通端口,你可能需要相应的权限才行
    denonw
        14
    denonw  
       2017-06-09 17:19:30 +08:00
    印象中不需要 bind 的吧?
    ray1888
        15
    ray1888  
    OP
       2017-06-09 17:35:15 +08:00
    @araraloren 在 windows 下面已经 netstat 过,20 端口并没有占用,但是就是不能这样绑定,权限已经是管理员权限
    hsmocc
        16
    hsmocc  
       2017-06-10 00:56:25 +08:00
    不知道是不是需要设置 self.tunnel_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1),lz 可以试试
    ray1888
        17
    ray1888  
    OP
       2017-06-12 10:33:30 +08:00
    @hsmocc 其实不是,是我在两个类里面的引用对象是否有绑定,如果再被调用的类中调用了本类中的属性,会无法绑定,导致之前创建的 socket 关闭不成功
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1062 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 22:42 · PVG 06:42 · LAX 15:42 · JFK 18:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.