Skip to main content
 首页 » 编程设计

Python:Unix 中的 Socket.error 连接被拒绝 [Errno 111]

2025年05月04日27jirigala

我正在尝试使用 Python 中的套接字发送 UDP 视频数据包。

服务器IP地址为:192.168.67.14

客户端IP地址为192.168.67.42

Client和Server可以互相ping通。下面是用于建立套接字的代码:

服务器端:

import urllib, time, os, m3u8 
from socket import * 
 
# Socket initialization 
 
s = socket(AF_INET, SOCK_DGRAM) 
host = "192.168.67.42" 
port = 5000 
buf = 1024 
addr = (host, port) 
s.connect((host, port)) 
 
ts_filenames = [] 
while True: 
    playlist = "https://sevenwestmedia01-i.akamaihd.net/hls/live/224853/TEST1/master_lowl.m3u8" 
    m3u8_obj = m3u8.load(playlist) 
    ts_segments = m3u8_obj.__dict__.values()[6] 
    ts_segments_str = str(m3u8_obj.segments) 
    for line in ts_segments_str.splitlines(): 
        if "https://" in line: 
            ts_id = line[-20:] 
            if ts_id not in ts_filenames: 
                print ts_id 
                ts_filenames.append(ts_id) 
                try: 
                    ts_segment = urllib.URLopener() 
                    ts_segment.retrieve(line, ts_id) 
                except: 
                    pass 
                f = open(ts_id, "rb") 
                data = f.read(buf) 
                while (data): 
                    if (s.sendto(data, addr)): 
                        print "sending ..." 
                        data = f.read(buf) 

客户端

import socket  
 
s = socket.socket()  
host = '192.168.67.14'  
port = 5000  
 
s.connect((host,port)) 
print s.recv(1024) 
s.close 

我得到的异常:

Traceback (most recent call last): File "client.py", line 7, in s.connect((host,port)) File "/usr/lib/python2.7/socket.py", line 228, in meth return getattr(self._sock,name)(*args) socket.error: [Errno 111] Connection refused

我花了一些时间研究 this discussion但我仍然不确定要修改什么。有什么建议吗?

请您参考如下方法:

这里有多个问题。首先,通过在服务器端使用 connect,您告诉操作系统您将只与 IP 地址“192.168.67.42”端口 5000 通信。这可能不是您想要的。 (服务器通常会与客户端想要与之交谈的任何人交谈。)

其次,通过在客户端中不指定 SOCK_DGRAM,您将获得默认套接字类型,即 SOCK_STREAM。这意味着您的客户端正在尝试通过 TCP 端口 80 连接 到您的服务器,而不是 UDP 端口 80(这两个命名空间是完全独立的)。

对于 UDP“ session ”,双方都需要一个 IP 地址和一个端口号。如果您没有特别绑定(bind)端口,操作系统将半随机地为您选择一个端口。为了连接客户端和服务器,他们必须至少就其中一项达成一致。

因此,典型的 UDP 服务器将绑定(bind)到一个众所周知的端口(大概您打算将 5000 用于该目的)。然后客户端可以通过该端口连接到服务器。代码看起来像这样(sans 错误处理):

服务器端:

# Create socket 
s = socket(AF_INET, SOCK_DGRAM) 
# Bind to our well known port (leave address unspecified  
# allowing us to receive on any local network address) 
s.bind(('', 5000)) 
 
# Receive from client (so we know the client's address/port) 
buffer, client_addr = s.recvfrom(1024)  
 
# Now we can send to the client 
s.sendto(some_buffer, client_addr) 

客户端和你的地址很接近,但是你应该先从客户端向服务器发送一些数据,这样服务器才能知道你的地址:

s = socket(AF_INET, SOCK_DGRAM) 
# Create connection to server (the OS will automatically  
# bind a port for the client) 
s.connect((host, port)) 
# Send dummy data to server so it knows our address/port 
s.send(b'foo') 
buffer = s.recv(1024) 

请注意,因为您已经在客户端使用了connect,所以您已经永久指定了您对等方的地址,不需要使用recvfrom 和sendto 。