2009-02-23 39 views
5

có một chút lạ với tôi rằng boost.asio không sử dụng khái niệm cơ bản khi ứng dụng khách kết nối với máy chủ - sử dụng địa chỉ IP và cổng. Có thể tôi là một chút noobie trong Boost - và tôi chấp nhận điều đó - nhưng dù sao tôi cũng không hiểu.
Vì vậy, tôi có mã như thế này để có được khách hàng kết nối đến máy chủ trên localhost:Cách boost.asio khám phá cổng nào là ứng dụng máy chủ của tôi đang nghe?


     boost::asio::io_service io_service; 
     tcp::resolver resolver(io_service); 
     tcp::resolver::query query("localhost", "daytime"); 
     tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); 
     tcp::resolver::iterator end; 

     tcp::socket socket(io_service); 
     boost::system::error_code error = boost::asio::error::host_not_found; 
     while(error && endpoint_iterator != end) { 
      socket.close(); 
      socket.connect(*endpoint_iterator++, error); 
     } 

Windows trong WinSock của nó 2.0 sử dụng hai tham số - IP và cổng - để xác định các máy chủ.
Vì vậy, qurestion là - chính xác Asio phát hiện cổng nào là máy chủ đang nghe kết nối? Nó có quét tất cả các cổng không? Và, nếu có, điều gì sẽ xảy ra nếu hai máy chủ lắng nghe trên các cổng khác nhau cùng một lúc?

Trả lời

5

Bạn đang nói rằng bạn muốn kết nối với máy chủ cục bộ trên cổng được sử dụng bởi dịch vụ ban ngày. Nó sẽ tra cứu số cổng thích hợp trong tệp dịch vụ (thường là C: \ WINDOWS \ system32 \ drivers \ etc \ services trong Windows, tôi tin/etc/services trong Unix). Bạn cũng có thể sử dụng số cổng rõ ràng ở đó.

+0

Tôi không hiểu rõ thông số thứ hai có nghĩa là gì trong truy vấn ctor. đầu tiên là địa chỉ IP mà tôi muốn kết nối, phải không? và ý nghĩa thứ hai là gì? – chester89

+0

Tham số thứ hai là số cổng hoặc tên dịch vụ. Nếu đó là tên dịch vụ, asio sẽ tra cứu nó trong tệp dịch vụ để tìm số cổng thích hợp cho dịch vụ đó. Hãy xem các tập tin dịch vụ với một trình soạn thảo văn bản và bạn sẽ thấy nó hoạt động như thế nào. – Ferruccio

+0

ok, sau đó làm thế nào tôi có thể bắt đầu một máy chủ trên một cổng tôi cần? mã cho điều đó ở phía máy chủ là: boost :: asio :: io_service io_service; tcp :: acceptor acceptor (io_service, tcp :: điểm cuối (tcp :: v4(), 13)); – chester89

8

Cố gắng,

tcp::resolver::query query("localhost", boost::lexical_cast<string>(port));//assuming port is an int 

Để trả lời câu hỏi của bạn, nhớ rằng bạn đang bắt đầu các máy chủ trên cổng 13. Điều này xảy ra là cổng mà chạy ban ngày dịch vụ Linux (http://www.sorgonet.com/linux/linuxdaemons/). Do đó, họ sau đó có thể sử dụng truy vấn ("localhost", "ban ngày") thay vì chỉ định cổng.

0

mở netcat nghe trên cổng 13 trên localhost nó sẽ chấp nhận kết nối của bản demo. gõ một số blabla khi nó kết nối và bạn sẽ thấy đầu ra trên chương trình demo để chạy netcat, chạy: nc -l -p 13

Windows? không có netcat? cài đặt cygwin và thêm netcat

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