2011-11-16 35 views
6

Một trong những trình xử lý gen_servers trong cuộc gọi ứng dụng của tôi gen_tcp:listen(Port, [{active, true}]). Lần đầu tiên tôi chạy thử nghiệm đơn vị, nó trả về {ok, Socket}, nhưng lần thứ hai tôi chạy cùng một bài kiểm tra đơn vị, nó trả về {error, eaddrinuse}, nhưngai sử dụng cổng TCP?

lsof -i TCP 

không trả về gì cả. Ngoài ra, khi cùng một đơn vị được chạy hai lần trên một máy khác (WinXP), nó hoạt động như mong đợi (nghĩa là, trả về {ok, Socket} cả hai lần). Vì vậy, gen_server của tôi rõ ràng là phát hành cổng, nhưng Erlang bằng cách nào đó không biết điều đó.

Vì vậy, làm thế nào tôi có thể tìm ra ai Erlang nghĩ sử dụng địa chỉ này?

+2

Bạn có thể sử dụng cờ reuseaddr để gen_tcp: lắng nghe để làm cho hành vi này trên Linux đi. – Lukas

Trả lời

9

Điều này là do chi tiết về việc triển khai TCP trên các hệ thống Unix-- khi một ổ cắm được mở để nghe, nó sẽ không hoạt động trong vài phút ở trạng thái CLOSE_WAIT sau khi quá trình lắng nghe tắt.

Từ Lukas' bình luận trên: bạn có thể sử dụng reuseaddr cờ để gen_tcp: lắng nghe để tránh điều này

+2

Oh cách tôi yêu tràn ngăn xếp :-D – dijxtra

0

nếu bạn đang ở trên cửa sổ bạn có thể sử dụng tiện ích netstat để tìm ra quá trình có cổng mở:

http://commandwindows.com/netstat.htm

netstat -a -b -v nên làm các trick

Linux netstat cũng hỗ trợ cho thấy người sử dụng , nhưng bạn cần quyền root cho điều đó.

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