2017-09-04 22 views
8

Giúp tôi theo dõi trạng thái của một cổng cụ thể: "LISTENING", "CLOSE_WAIT", "ESTABLISHED". Tôi có một giải pháp tương tự với lệnh netstat:Tôi có thể tìm trạng thái của cổng bằng thư viện Lua "socket" không?

local command = 'netstat -anp tcp | find ":1926 " ' 
local h = io.popen(command,"rb") 
local result = h:read("*a") 
h:close() 
print(result) 
if result:find("ESTABLISHED") then 
    print("Ok") 
end 

Nhưng tôi cần phải làm tương tự với các Lua socket library. Có thể không?

+0

Tại sao? Chắc chắn bạn đã biết tình trạng của ổ cắm của riêng bạn? Nếu bạn gọi là 'listen()', nó là LISTENING; nếu bạn gọi là 'connect()' hoặc 'accept()', nó được thành lập; nếu nó đã nhận và kết thúc luồng, nó sẽ ở trong CLOSE_WAIT. – EJP

+0

@EJP Câu hỏi không nói rằng ổ cắm được sở hữu bởi cùng một quá trình tạo truy vấn. Thậm chí sau đó, bạn không thể dễ dàng phỏng đoán một số tiểu bang - ví dụ: TIME_WAIT - không truy vấn hạt nhân. –

Trả lời

1

Bạn không thể truy vấn trạng thái của ổ cắm thuộc sở hữu của một quy trình khác bằng API ổ cắm, đó là những gì LuaSocket sử dụng bên dưới nắp.

Để truy cập thông tin về quy trình khác, bạn cần truy vấn hệ điều hành để thay thế. Giả sử bạn đang sử dụng Linux, điều này thường có nghĩa là xem xét hệ thống tập tin proc.

Tôi không quá quen thuộc với Lua, nhưng Google nhanh chóng cung cấp cho tôi dự án này: https://github.com/Wiladams/lj2procfs. Tôi nghĩ rằng đây có lẽ là những gì bạn cần, giả sử họ đã viết một bộ giải mã cho các tập tin có liên quan /proc/net bạn cần.

Đối với tệp nào? Nếu đó chỉ là trạng thái, tôi nghĩ bạn muốn tệp tcp được bao gồm trong http://www.onlamp.com/pub/a/linux/2000/11/16/LinuxAdmin.html

1

Giống như @Peter cho biết, netstat sử dụng hệ thống tệp proc để thu thập thông tin mạng, đặc biệt là ràng buộc cổng. LuaSockets có thư viện riêng để truy xuất thông tin kết nối. Ví dụ,

Nghe bạn có thể sử dụng master:listen(backlog) trong đó xác định các ổ cắm sẵn sàng nhận các kết nối, chuyển các đối tượng vào một đối tượng máy chủ. Các đối tượng máy chủ hỗ trợ chấp nhận, getockname, setoption, settimeout và các phương thức đóng. Thông số backlog chỉ định số lượng kết nối máy khách có thể được xếp hàng chờ đợi dịch vụ. Nếu hàng đợi đầy và máy khách khác thử kết nối, kết nối sẽ bị từ chối. Trong trường hợp thành công, phương thức trả về 1. Trong trường hợp lỗi, phương thức trả về nil theo sau là một thông báo lỗi.

Các phương pháp sau sẽ trả về một chuỗi có địa chỉ IP cục bộ và một số với cổng . Trong trường hợp lỗi, phương thức trả về nil.

master:getsockname() 
client:getsockname() 
server:getsockname() 

Ngoài ra còn tồn tại phương pháp này: client:getpeername() Đó sẽ trả về một chuỗi với địa chỉ IP của bạn bè, tiếp theo là cổng số đó ngang được sử dụng cho kết nối. Trong trường hợp lỗi, phương thức trả về nil.

Đối với "CLOSE_WAIT", "THÀNH LẬP" hoặc thông tin kết nối khác mà bạn muốn truy xuất, vui lòng đọc Official Documentation. Nó có mọi thứ bạn cần với giải thích ngắn gọn về các phương pháp.

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