2009-03-19 31 views
34

Tôi cần nhanh chóng triển khai giải pháp máy chủ/khách hàng C hoặc C++ TCP rất nhỏ. Điều này chỉ đơn giản là để chuyển nghĩa đen là một mảng các byte từ một máy tính khác - không cần phải có khả năng mở rộng/quá phức tạp. Đơn giản càng tốt. Nhanh chóng và bẩn nếu bạn có thể.Máy chủ và máy khách TCP C hoặc C++ đơn giản là gì?

Tôi cố gắng để sử dụng mã từ hướng dẫn này, nhưng tôi không thể có được nó để xây dựng sử dụng g ++ trong Linux: http://www.linuxhowtos.org/C_C++/socket.htm

Nếu có thể, tôi muốn tránh thư viện của bên thứ 3, khi hệ thống tôi đang chạy trên này là khá hạn chế. Đây phải là C hoặc C++ vì ứng dụng hiện tại đã được triển khai.

Nhờ EMG-2 's câu trả lời, tôi quản lý để thực hiện nêu trên mẫu mã tương thích với C++ sử dụng các bước sau:

Thêm các tiêu đề cho cả client và server:

#include <cstdlib> 
#include <cstring> 
#include <unistd.h> 

Trong server.c, thay đổi loại clilen thành socklen_t.

int sockfd, newsockfd, portno/*, clilen*/; 
socklen_t clilen; 

Trong client.c, thay đổi dòng sau:

if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0) { ... } 

Để:

if (connect(sockfd,(const sockaddr*)&serv_addr,sizeof(serv_addr)) < 0) 

Trả lời

39

Tôi đã sử dụng Beej's Guide to Network Programming trong quá khứ. Đó là trong C, không phải C++, nhưng các ví dụ là tốt. Truy cập trực tiếp vào section 6 để biết các chương trình ví dụ về máy khách và máy chủ đơn giản.

+0

Cảm ơn - Tôi đã tìm thấy một mẫu (http://beej.us/guide/bgnet/output/html/multipage/clientserver.html#simpleserver) nhưng tôi không chắc chắn nếu nó quá mức cần thiết, tôi có thực sự cần tất cả mã đó không? –

+0

@ nickbolton2705: Có thể là có. Mã của Beej có lỗi xử lý bao gồm, đó là một phần lý do tôi thích nó rất nhiều. Cũng lưu ý rằng máy chủ hỗ trợ nhiều kết nối đồng thời, và IPv4 và IPv6. –

+0

Vâng, điều này sẽ là tuyệt vời cho một giải pháp thanh lịch - Tôi nhận thấy một trong những tính năng là serialization, mà có thể hữu ích cho tôi, tôi nên cần phải thực hiện điều này đúng tại một số điểm. –

7

thử boost :: lib ASIO (http://www.boost.org/doc/libs/1_36_0/doc/html/boost_asio.html) nó có ví dụ rất nhiều.

+1

Những mẫu này có phù hợp không? http://www.boost.org/doc/libs/1_36_0/doc/html/boost_asio/example/iostreams/daytime_server.cpp http://www.boost.org/doc/libs/1_36_0/doc /html/boost_asio/example/iostreams/daytime_client.cpp –

12

Nếu mã phải đơn giản, bạn có thể yêu cầu ví dụ C dựa trên ổ cắm BSD truyền thống. Các giải pháp như boost::asio là imho khá phức tạp khi nói đến ví dụ "hello world" ngắn và đơn giản.

Để biên dịch các ví dụ bạn đã đề cập, bạn phải thực hiện các bản sửa lỗi đơn giản, vì bạn đang biên dịch theo trình biên dịch C++. Tôi đang đề cập đến các file sau:
http://www.linuxhowtos.org/data/6/server.c
http://www.linuxhowtos.org/data/6/client.c
từ: http://www.linuxhowtos.org/C_C++/socket.htm

  1. Add sau bao gồm cả tập tin:

    #include <cstdlib> 
    #include <cstring> 
    #include <unistd.h> 
    
  2. Trong client.c, thay đổi dòng:

    if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0) 
    { ... } 
    

    tới:

    if (connect(sockfd,(const sockaddr*)&serv_addr,sizeof(serv_addr)) < 0) 
    { ... } 
    

Như bạn có thể thấy trong C++ một diễn viên rõ ràng là cần thiết.

+1

Ngoài ra, trong server.c I đã phải thay đổi loại clilen thành socklen_t, và cast ouput của sizeof (cli_addr); –

+0

câu trả lời ngắn gọn. – bdd

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