【问题标题】:C program to receive TCP data stream [closed]C程序接收TCP数据流[关闭]
【发布时间】:2020-05-28 21:51:36
【问题描述】:

我必须用C语言编写一个程序来接收TCP数据流。我想知道

  1. 考虑到我是网络和 C 编程新手,需要付出什么努力

  2. 另外,我遇​​到了 Boost C++ 库。我想了解,这些库是否提供了现成的 TCP 客户端和服务器创建程序,或者它们是否提供了我们可以进一步研究的基础知识?

【问题讨论】:

  • Boost 是 C++。你不能真正从 C 中使用它的库。
  • 您可以从 beej.us/guide/bgnet 或 W. Richard Stevens 的书 UNIX Network Programming, Volume 1 开始。
  • 我知道 boost C++ 不能用于 C,但想知道它是否提供了我们可以进一步工作的基本程序?
  • Boost::asio 不会让它变得更简单。它更抽象:你可以讨厌它或喜欢它,但我不会从它开始。无论如何,它不会让它变得更简单。您需要编写 TCP 客户端还是服务器?无论如何,所需的努力只是......今天是不可避免的:)

标签: c networking tcp boost-asio tcpclient


【解决方案1】:

这里是 TCP 客户端 C++ 代码,如您在评论中询问的那样,带有 boost 库

#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;
}

编译并运行。

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

TCP 服务器:

#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;
}

编译并在另一个窗口中运行

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

【讨论】:

    猜你喜欢
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多