boost::asio 프로그래밍 - 동기 TCP
boost.asio 라이브러리는 크로스 플랫폼 네트워크이자 기본 IO C++ 프로그래밍 라이브러리로, 최신 C++ 기술을 사용하여 통합 비동기 호출 모델을 구현합니다.
Boost.asio 라이브러리는 TCP, UDP 및 ICMP 통신 프로토콜을 지원합니다.
다음은 동기 TCP 모드를 소개합니다.
안녕하세요 여러분! 저는 동기화 모드에요!
저의 가장 큰 특징은 끈기입니다! 모든 작업을 완료하거나 오류를 범해야만 복귀가 가능합니다. 그런데 저의 고집이 모두에게 차단이라고 하니 정말 답답하네요~~(시청자들 야유) 사실은 이렇습니다.
명확한 논리와 보다 쉬운 프로그래밍 등의 이점도 있습니다.
서버 측에서는 소켓을 만들어서 Acceptor 객체에 전달하고 클라이언트가 연결될 때까지 기다리게 하고, 연결 후 이 소켓을 통해 클라이언트와 통신하게 됩니다.
모든 통신은 차단 방식으로 수행되며 읽기 또는 쓰기가 완료될 때까지 반환되지 않습니다.
이때도 마찬가지로 소켓을 이용하여 서버에 접속하게 됩니다. 결국 차단 방식으로 서버와 통신하겠습니다.
동기식 방식이 비동기식만큼 효율적이지 않다고 생각하는 사람들도 있습니다. 사실 이는 일방적인 이해입니다. 이는 네트워크 작업에 소요되는 시간을 다른 작업에 사용할 수 없는 단일 스레드의 경우에 해당될 수 있습니다.
감정은 좋은 조정 방법이 아닙니다. 하지만 이 문제는 멀티스레딩을 통해 방지할 수 있습니다. 예를 들어 서버측에서는 스레드 중 하나가 클라이언트의 연결을 기다리는 역할을 담당하고, 연결이 들어온 후 소켓을 다른 스레드로 넘겨줍니다.
클라이언트와 통신하여 한 클라이언트와 통신하는 동안 다른 클라이언트의 연결도 수락할 수 있으며 기본 스레드가 완전히 해제됩니다.
제 소개입니다. 모두들 감사합니다!
동기화 모드 샘플 코드:
서버측
// BoostTcpServer.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "boost/asio.hpp" #include "boost/thread.hpp" using namespace std; using namespace boost::asio; #ifdef _MSC_VER #define _WIN32_WINNT 0X0501 //避免VC下编译警告 #endif #define PORT 1000 #define IPV6 //#define IPV4 int _tmain(int argc, _TCHAR* argv[]) { // 所有asio类都需要io_service对象 io_service iosev; //创建用于接收客户端连接的acceptor对象 #ifdef IPV4 ip::tcp::acceptor acceptor(iosev,ip::tcp::endpoint(ip::tcp::v4(), PORT)); #endif #ifdef IPV6 ip::tcp::acceptor acceptor(iosev,ip::tcp::endpoint(ip::tcp::v6(), PORT)); #endif while (true) { // socket对象 ip::tcp::socket socket(iosev); // 等待直到客户端连接进来 acceptor.accept(socket); // 显示连接进来的客户端 std::cout <<"remote ip:"<<socket.remote_endpoint().address()<<endl; std::cout <<"remote port:"<<socket.remote_endpoint().port() << std::endl; char buf[2048]; boost::system::error_code ec; while(1) { socket.read_some(buffer(buf),ec); if (ec) { std::cout <<boost::system::system_error(ec).what() << std::endl; break ; } std::cout<<"recv msg:"<<buf<<endl; if(strcmp(buf,"bye")==0)//收到结束消息结束客户端连接 { break; } socket.write_some(buffer("I heared you!\n"),ec); if (ec) { std::cout <<boost::system::system_error(ec).what() << std::endl; break ; } } socket.close(); // 与当前客户交互完成后循环继续等待下一客户连接 } return 0; }
클라이언트측
// BoostTcpClient.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "boost/asio.hpp" using namespace boost::asio; #ifdef _MSC_VER #define _WIN32_WINNT 0X0501 //避免VC下编译警告 #endif #define PORT 1000 #define IPV6 //#define IPV4 int _tmain(int argc, _TCHAR* argv[]) { // 所有asio类都需要io_service对象 io_service iosev; // socket对象 ip::tcp::socket socket(iosev); // 连接端点,这里使用了本机连接,可以修改IP地址测试远程连接 #ifdef IPV4 ip::address_v4 address=ip::address_v4::from_string("127.0.0.1"); #endif #ifdef IPV6 //"0:0:0:0:0:0:0:1"为IPV6的本机回环地址,类似于"127.0.0.1" ip::address_v6 address=ip::address_v6::from_string("0:0:0:0:0:0:0:1"); #endif ip::tcp::endpoint ep(address, PORT); // 连接服务器 boost::system::error_code ec; socket.connect(ep,ec); // 如果出错,打印出错信息 if (ec) { std::cout << boost::system::system_error(ec).what() << std::endl; return -1; } //循环发送和接收数据 for(int i=0;i<5;++i) { //发送数据 socket.write_some(buffer("hello"), ec); // 接收数据 char buf[100]; size_t len=socket.read_some(buffer(buf), ec); std::cout.write(buf, len); Sleep(500); } //发送与服务端约定好的结束语,由服务端断链 socket.write_some(buffer("bye"), ec); getchar(); return 0; }
코드는 IPV4와 IPV6 두 가지 IP 프로토콜과 호환됩니다. 매크로 정의를 사용하여 사용할 IP 프로토콜을 선택하세요. 물론 정상적인 통신을 위해서는 클라이언트와 서버의 프로토콜이 일치해야 합니다.
읽어주셔서 감사합니다. 더 많은 관련 글을 보시려면 PHP 중국어 홈페이지(www.php.cn)를 주목해주세요!