2010-10-04 27 views
11

Tôi có một số mã C hiện có sử dụng các socket thô ICMP để thực hiện Ping và tôi cần sử dụng mã này trong Java vì Java không hỗ trợ các gói ICMP. Khi tôi quấn mã trong JNI và gọi nó, mã C sẽ không lấy được socket khi đang thực hiện:Cách tốt nhất để thực hiện lập trình socket RAW liên quan đến Java

socket (AF_INET, SOCK_RAW, 1);

Tôi đoán rằng Java đã loại bỏ một số đặc quyền vô hiệu hóa việc sử dụng ổ cắm thô từ quá trình Java. Điều này tôi phải tìm một giải pháp cho.

tôi đã quan sát như sau:

  • Nếu tôi viết một chương trình C và gọi đó là từ Java Runtime sử dụng mã chia hai có thể mở ổ cắm.
  • Nếu tôi chạy mã nguồn gốc này từ Eclipse nó cũng chạy độc đáo. Tôi đoán điều này xuất phát từ thực tế là Eclipse đã được bắt đầu từ eclipse.exe, chứ không phải từ java.exe.

Điều này có nghĩa là tôi có thể giải quyết vấn đề của mình bằng cách chọn một trong hai chiến lược này, nhưng tôi không thích. Có cách nào khác để tôi có thể nhận Java chấp nhận rằng mã JNI đang mở ổ cắm này không?

Chỉnh sửa: Tôi càng xem xét vấn đề này tôi nhận thấy rằng nó phải là một vấn đề liên quan đến Windows 7 với cách Java đang được bắt đầu. Nó cũng xuất hiện rằng nếu bạn nhận được các cửa sổ để hành xử hoặc nếu bạn đang ở trên một số nền tảng khác với Windows thì phương thức InetAddress.isReachable() cũng có thể được sử dụng.

Trả lời

5

Có thể sử dụng lib ổ cắm gốc Java hiện có? Sau đó, bạn không phải lo lắng về việc mã hóa lib JNI.

Xem: http://www.savarese.com/software/rocksaw/

+0

Thư viện này trông tuyệt vời. Nó là mặc dù làm giống như mã nguồn gốc của chúng tôi đã làm, vì vậy vấn đề của tôi phải là cửa sổ liên quan. – Knubo

+0

Vâng, tôi thấy việc viết các thư viện JNI là một chút đau đớn. Vì vậy, khi nghi ngờ-- hãy sử dụng thứ gì đó đã tồn tại. Bạn có nhận được lib này để làm việc với Windows 7 hoặc là nó không? – Andy

+0

Chúng tôi quyết định đi với Runtime.exec() vì chúng ta phải giải quyết nó và tiếp tục tiến lên phía trước. Tôi nghĩ rằng câu trả lời của bạn là tốt nhất cho đến nay và nó thực sự nên giải quyết câu hỏi của tôi mặc dù không phải vấn đề của tôi vì vậy tôi sẽ chấp nhận nó :) – Knubo

0

Bạn cũng có thể thử phương pháp java.net.InetAddress.isReachable(), đây là có sẵn từ J2SE5 trở đi.

Nhưng nó không hoạt động như mong đợi trong Windows. Xem: http://bordet.blogspot.com/2006/07/icmp-and-inetaddressisreachable.html

+0

Phương pháp này không phù hợp với trường hợp sử dụng mà chúng tôi cần làm và chúng tôi cũng cần nó để hoạt động trên Windows. – Knubo

+1

Phương thức này chỉ hoạt động đúng khi bạn có quyền tài khoản gốc - nó gửi yêu cầu ICMP ECHO thô trong trường hợp này, nếu không nó sẽ cố thiết lập kết nối TCP trên cổng 7 (dịch vụ echo) không phải lúc nào cũng mở. Do đó, nó sẽ thất bại trong một số trường hợp, khi Java chưa được chạy từ tài khoản gốc. –

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