2010-11-16 91 views
14

Gần đây tôi đã nhận được nhiều hơn vào C++. Tôi đã làm một số (rất tối thiểu) lập trình socket với C, nhưng đã được quan tâm đến làm một số công việc với C + +. Tôi chỉ có thể tìm thấy tài liệu tham khảo/hướng dẫn về việc triển khai socket dựa trên C. Có một lý do cho điều này? Tôi biết, hoặc tin rằng tôi biết rằng bạn có thể sử dụng các thư viện socket C cho C + +, nhưng tôi không chắc chắn.API Socket hoặc thư viện cho C++?

Có thư viện socket C++ nào được sử dụng thường xuyên hơn không? Đây không phải là một câu hỏi chủ quan, tôi thực sự đang tìm hiểu xem các API/thư viện của Socket API dành cho C++.

Tôi khá mới trong lập trình socket và C++, vì vậy xin vui lòng không có câu trả lời sẽ ném cho tôi một vòng lặp.

Cảm ơn

+2

Một bài kiểm tra quan trọng của bất kỳ thư viện socket là liệu nó phơi bày sự kiện. Qt, API socket Win32 riêng (xem 'WSAAsyncSelect'), ổ cắm BSD tạo ra các sự kiện có thể mà không làm cho chúng trở nên dễ dàng (' select' và 'poll', ngược lại với tên là event-driven, không polling, hoặc' XtAppAddInput '). Nhiều thư viện khác buộc bạn vào phong cách chặn một luồng cho mỗi kết nối không chỉ không hiệu quả mà còn dẫn đến lỗi. Điều phức tạp ở đây là các sự kiện socket và UI hoặc cổng nối tiếp của bạn hoặc bất kỳ sự kiện nào khác mà chương trình của bạn đề cập phải tương thích trong một vòng lặp sự kiện duy nhất. –

Trả lời

8

Ở đây tôi đang cố gắng trả lời một số câu hỏi thực tế cụ thể mà tôi có gì đó để đóng góp.

Có, bạn có thể sử dụng bất kỳ thư viện socket C nào trong C++. Nếu nó không hoạt động ngoài hộp vì trình liên kết báo cáo tham chiếu không xác định cho các chức năng thư viện bạn muốn sử dụng, sau đó có thể khắc phục bằng cách chỉnh sửa (các) tệp .h của thư viện, thêm extern "C" vào phía trước của tất cả các khai báo biến toàn cục và hàm.

Để tìm thư viện, hãy truy cập http://freshmeat.net/ và tìm kiếm C++ socket hoặc C socket. Dưới đây là những gì tôi đã tìm thấy cho C++ socket:

  • Socket++.
  • ENUt.
  • LibSylph.
  • CPPSocket cũng có thể làm việc cho bạn, mặc dù bản cập nhật cuối cùng là vào năm 2003.
  • SocketW là tương tự như cũ: cập nhật cuối cùng trong 2003.

Như Raphael đã đề cập trong câu trả lời của mình, bạn có thể thấy các ổ cắm một phần của thư viện Qt hữu ích. Xem QTCpSocket để tham khảo và fortune client để biết mã ví dụ.

Ngoài ra Boost.Asio đã xuất hiện trong tâm trí của tôi, nhưng có thể có quá nhiều chi tiết trừu tượng và chi tiết cấp thấp được hiển thị cho bạn.

Thực hiện tìm kiếm của bạn cho C socket trên freshmeat, bạn có thể tìm thấy một thư viện C phù hợp hơn bất kỳ thư viện C++ nào.

+2

libsylph không xuất hiện để đối phó với ổ cắm hoặc mạng cả. socketw là một wrapper rất mỏng. socket ++ làm cho việc sử dụng ổ cắm trở nên cực kỳ dễ dàng và dường như không cung cấp bất kỳ cách nào để sử dụng ổ cắm tốt (không chặn). –

+0

lol, nhớ freshmeat? – cat

3

Tôi thích sử dụng Qt cho ổ cắm chương trình. Nó cung cấp triển khai hướng đối tượng và đa nền tảng

+0

Nhưng kinh dị của nó để sử dụng nó với các chủ đề khác nhau. (bạn phải làm việc với các tín hiệu giữa) – leon22

4

Tôi chỉ có thể tìm thấy tham chiếu/hướng dẫn về triển khai ổ cắm dựa trên C. Có một lý do cho điều này?

Có lẽ bởi vì tất cả việc triển khai ổ cắm được dựa trên ngôn ngữ C berkeley api ổ cắm ban đầu trong đó xác định các chức năng như recv, gửi, lắng nghe, chấp nhận, chọn, vv

Tôi rất có thể khuyên bạn nên nhìn vào Tăng ASIO. Đó là một nền tảng C++ API đa nền tảng nên bất kỳ mã nào bạn phát triển đều có thể di chuyển được. Trong thực tế, một số thư viện Boost khác bạn sẽ thấy hữu ích cho bạn và tất cả chúng đều là nền tảng chéo.

Với tham chiếu đến API cơ bản. Bạn có thể sử dụng các hàm socket C gốc trong cả hai cửa sổ và Linux. Tuy nhiên, lưu ý rằng dưới cửa sổ có một số khác biệt nhỏ. ví dụ. trước tiên bạn phải gọi hàm WSAstartup.

Tham chiếu thực sự tốt về lập trình socket cơ bản là Hướng dẫn lập trình mạng của Beej.

http://beej.us/guide/bgnet/

tôi khuyên bạn nên có một chút của một đọc qua nó ngay cả khi bạn đang sử dụng C++ api vì nó cung cấp cho bạn một sự hiểu biết về những gì đang xảy ra.


Chỉnh sửa: Thành thật mà nói tôi không sử dụng Boost ASIO nữa. Tôi thấy nó chậm khủng khiếp. Sử dụng LibEV hoặc tương tự hoặc cuộn của riêng bạn. Boost ASIO dường như không sử dụng epoll trên Linux.

4

Tôi đã phát triển một thư viện cho các ổ cắm trong c + +, nhưng chỉ dành cho các cửa sổ. Nó cung cấp một thực hiện hướng đối tượng với các cuộc gọi lại để nhận tin nhắn!

Đây là cách tôi thực hiện một kết nối từ client:

#include <iostream> 
#include <winsock2.h> 
#include "SocketClient.h" 

using namespace std; 

void onError(errorStruct *e) 
{ 
    cout << e->code << " : " << e->message << endl; 
} 

int main() 
{ 
    SocketClient client("127.0.0.1", 5555); 
    client.setErrorCallback(onError); 
    client.connect(); 
    client.send("Hello World!"); 
    client.close(); 
} 

Và đây là phần server:

#include <iostream> 
#include <winsock2.h> 
#include "SocketClient.h" 
#include "SocketServer.h" 

using namespace std; 

bool good=true; 

void messageReceived(messageStruct *s) 
{ 
    cout << "client: " << s->message << endl; 
} 

void errorOccurred(errorStruct *e) 
{ 
    cout << e->code << " : " << e->message << endl; 
    good=false; 
} 

int main() 
{ 
    SocketServer server(5555); 
    SocketClient client(server.accept()); 
    client.setErrorCallback(errorOccurred); 
    client.setMessageCallback(messageReceived); 

    while(good){}; 

    client.close(); 
    server.close(); 
} 

Như bạn có thể nhìn thấy nó thực hiện callbacks để tiếp nhận các thông điệp và xử lý lỗi.

Đây là github cho quan tâm: SocketClient

Và đây là một hướng dẫn tôi thực hiện trên blog của tôi: Cause You're Stuck