Search code examples
cnetwork-programmingtcpboost-asiotcpclient

C program to receive TCP data stream


I have to write a program in the C language to receive TCP data streams. I would like to know

  1. What is effort required considering I am new to networking and C programming?

  2. Also, I came across the Boost C++ libraries. I want to understand, do those libraries provide a ready made TCP client and Server creation programs or do they provide the basics on which we can further work on?


Solution

  • Here is TCP client C++ code with boost library as you asked in comment

    #include <iostream>
    #include <boost/asio.hpp>
    
    using namespace boost::asio;
    using ip::tcp;
    using std::string;
    using std::cout;
    using std::endl;
    
    int main() {
         boost::asio::io_service io_service;
    //socket creation
         tcp::socket socket(io_service);
    //connection
         socket.connect( tcp::endpoint( boost::asio::ip::address::from_string("127.0.0.1"), 1234 ));
    // request/message from client
         const string msg = "Hello from Client!\n";
         boost::system::error_code error;
         boost::asio::write( socket, boost::asio::buffer(msg), error );
         if( !error ) {
            cout << "Client sent hello message!" << endl;
         }
         else {
            cout << "send failed: " << error.message() << endl;
         }
     // getting response from server
        boost::asio::streambuf receive_buffer;
        boost::asio::read(socket, receive_buffer, boost::asio::transfer_all(), error);
        if( error && error != boost::asio::error::eof ) {
            cout << "receive failed: " << error.message() << endl;
        }
        else {
            const char* data = boost::asio::buffer_cast<const char*>(receive_buffer.data());
            cout << data << endl;
        }
        return 0;
    }
    

    Compile and run.

    $ g++ client.cpp -o client –lboost_system
    $ ./client  
    

    TCP server:

    #include <iostream>
    #include <boost/asio.hpp>
    
    using namespace boost::asio;
    using ip::tcp;
    using std::string;
    using std::cout;
    using std::endl;
    
    string read_(tcp::socket & socket) {
           boost::asio::streambuf buf;
           boost::asio::read_until( socket, buf, "\n" );
           string data = boost::asio::buffer_cast<const char*>(buf.data());
           return data;
    }
    void send_(tcp::socket & socket, const string& message) {
           const string msg = message + "\n";
           boost::asio::write( socket, boost::asio::buffer(message) );
    }
    
    int main() {
          boost::asio::io_service io_service;
    //listen for new connection
          tcp::acceptor acceptor_(io_service, tcp::endpoint(tcp::v4(), 1234 ));
    //socket creation 
          tcp::socket socket_(io_service);
    //waiting for connection
          acceptor_.accept(socket_);
    //read operation
          string message = read_(socket_);
          cout << message << endl;
    //write operation
          send_(socket_, "Hello From Server!");
          cout << "Servent sent Hello message to Client!" << endl;
       return 0;
    }
    

    compile and run in another window

    $ g++ server.cpp -o server –lboost_system
    $ ./server