2015-08-31 21 views
5

Tôi có một tập lệnh Python tạo nhiều kết nối đồng thời, ngắn ngủi bằng cách sử dụng thư viện requests. Tôi đặc biệt cần phải tìm ra các cổng nguồn được sử dụng bởi mỗi kết nối và tôi con số tôi cần truy cập vào ổ cắm cơ bản cho điều đó. Có cách nào để có được điều này thông qua các đối tượng phản ứng?Cách lấy ổ cắm bên dưới khi sử dụng các yêu cầu Python

+0

Một giải pháp thay thế có thể là trong cửa sổ 'netstat -a' có thể liệt kê tất cả các quy trình với các cổng được sử dụng. Bạn có thể mã một kịch bản python để có được đầu ra của lệnh này và sau đó làm công việc tiếp theo. Nó không phải là khó. Không chắc chắn nếu điều này có thể được thực hiện bởi 'yêu cầu' lib. –

+0

Có nhiều kết nối đồng thời ngắn ngủi trong chương trình của tôi. Không có cách nào để biết cổng nào thuộc về kết nối nào. – Elektito

+0

Bạn có thể truy xuất tất cả các cổng được ứng dụng của bạn sử dụng, nhưng bạn không thể sử dụng bất kỳ lệnh tích hợp nào (Windows) để tìm kết nối ứng dụng của bạn đang sử dụng số cổng nào. Tôi sẽ đề nghị hỏi trong Superuser.com –

Trả lời

3

Đối với kết nối trực tuyến (được mở bằng tham số stream=True), bạn có thể gọi phương thức .raw.fileno() trên đối tượng phản hồi để nhận mô tả tệp mở.

Bạn có thể sử dụng phương pháp socket.fromfd(...) để tạo ra một đối tượng Socket Python từ mô tả:

>>> import requests 
>>> import socket 
>>> r = requests.get('http://google.com/', stream=True) 
>>> s = socket.fromfd(r.raw.fileno(), socket.AF_INET, socket.SOCK_STREAM) 
>>> s.getpeername() 
('74.125.226.49', 80) 
>>> s.getsockname() 
('192.168.1.60', 41323) 

Đối với ổ cắm phi trực tuyến, các bộ mô tả tập tin được dọn dẹp trước khi đối tượng response được trả về. Theo như tôi có thể nói không có cách nào để có được nó trong tình huống này.

+2

Điều này làm việc tuyệt vời. Tôi phát hiện ra rằng nếu tôi sử dụng phương pháp của bạn bên trong "callback" response, tôi có thể thực hiện điều này ngay cả với các yêu cầu không streaming. – Elektito

Các vấn đề liên quan