Home Backend Development C#.Net Tutorial C++ boost::asio programming-synchronous TCP detailed explanation and example code

C++ boost::asio programming-synchronous TCP detailed explanation and example code

Dec 14, 2016 pm 05:01 PM
tcp programming

boost::asio Programming - Synchronous TCP

boost.asio library is a cross-platform network and underlying IO C++ programming library. It uses modern C++ techniques to implement a unified asynchronous calling model.

boost.asio library supports TCP, UDP, and ICMP communication protocols.

The following introduces the synchronous TCP mode:

Hello everyone! I am in sync mode!

My main characteristic is persistence! All operations must be completed or make an error before returning. However, my persistence is called blocking by everyone, which is really depressing~~ (The audience booed), in fact, this is There are also benefits, such as clear logic and easier programming.

On the server side, I will make a socket and give it to the acceptor object, and let it wait for the client to connect. After connecting, I will communicate with the client through this socket. All communications are performed in a blocking manner and will not return until reading or writing is completed.

The same goes for the client. At this time, I will use the socket to connect to the server. Of course, I will only return when the connection is connected or an error occurs. In the end, I will communicate with the server in a blocking manner.
Some people think that the synchronous method is not as efficient as the asynchronous method. In fact, this is a one-sided understanding. This may be true in a single-threaded case, where I can't use the time spent on network operations to do anything else Emotion is not a good coordination method. However, this problem can be avoided through multi-threading. For example, on the server side, one of the threads is responsible for waiting for the client to connect, and after the connection comes in, the socket is handed over to another thread. Communicate with the client, so that while communicating with one client, you can also accept connections from other clients, and the main thread is completely freed.

That’s my introduction, thank you everyone!

Synchronization mode sample code:

Server side

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

// 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;

}

Copy after login

Client side

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

// 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;

}

Copy after login

The code is compatible with both IPV4 and IPV6 IP protocols. Use macro definition to choose which IP protocol to use. Of course, the client The protocol with the server must be consistent for normal communication.

Thanks for reading, I hope it can help everyone. For more related articles, please pay attention to the PHP Chinese website (www.php.cn)!


Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: How To Unlock Everything In MyRise
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Remove duplicate values ​​from PHP array using regular expressions Remove duplicate values ​​from PHP array using regular expressions Apr 26, 2024 pm 04:33 PM

How to remove duplicate values ​​from PHP array using regular expressions: Use regular expression /(.*)(.+)/i to match and replace duplicates. Iterate through the array elements and check for matches using preg_match. If it matches, skip the value; otherwise, add it to a new array with no duplicate values.

What is programming for and what is the use of learning it? What is programming for and what is the use of learning it? Apr 28, 2024 pm 01:34 PM

1. Programming can be used to develop various software and applications, including websites, mobile applications, games, and data analysis tools. Its application fields are very wide, covering almost all industries, including scientific research, health care, finance, education, entertainment, etc. 2. Learning programming can help us improve our problem-solving skills and logical thinking skills. During programming, we need to analyze and understand problems, find solutions, and translate them into code. This way of thinking can cultivate our analytical and abstract abilities and improve our ability to solve practical problems.

Build browser-based applications with Golang Build browser-based applications with Golang Apr 08, 2024 am 09:24 AM

Build browser-based applications with Golang Golang combines with JavaScript to build dynamic front-end experiences. Install Golang: Visit https://golang.org/doc/install. Set up a Golang project: Create a file called main.go. Using GorillaWebToolkit: Add GorillaWebToolkit code to handle HTTP requests. Create HTML template: Create index.html in the templates subdirectory, which is the main template.

Collection of C++ programming puzzles: stimulate thinking and improve programming skills Collection of C++ programming puzzles: stimulate thinking and improve programming skills Jun 01, 2024 pm 10:26 PM

C++ programming puzzles cover algorithm and data structure concepts such as Fibonacci sequence, factorial, Hamming distance, maximum and minimum values ​​of arrays, etc. By solving these puzzles, you can consolidate C++ knowledge and improve algorithm understanding and programming skills.

The Key to Coding: Unlocking the Power of Python for Beginners The Key to Coding: Unlocking the Power of Python for Beginners Oct 11, 2024 pm 12:17 PM

Python is an ideal programming introduction language for beginners through its ease of learning and powerful features. Its basics include: Variables: used to store data (numbers, strings, lists, etc.). Data type: Defines the type of data in the variable (integer, floating point, etc.). Operators: used for mathematical operations and comparisons. Control flow: Control the flow of code execution (conditional statements, loops).

Problem-Solving with Python: Unlock Powerful Solutions as a Beginner Coder Problem-Solving with Python: Unlock Powerful Solutions as a Beginner Coder Oct 11, 2024 pm 08:58 PM

Pythonempowersbeginnersinproblem-solving.Itsuser-friendlysyntax,extensivelibrary,andfeaturessuchasvariables,conditionalstatements,andloopsenableefficientcodedevelopment.Frommanagingdatatocontrollingprogramflowandperformingrepetitivetasks,Pythonprovid

Get Go modules quickly and easily with Go Get Get Go modules quickly and easily with Go Get Apr 07, 2024 pm 09:48 PM

Through GoGet, you can quickly and easily obtain Go modules. The steps are as follows: Run in the terminal: goget[module-path], where module-path is the module path. GoGet automatically downloads the module and its dependencies. The location of the installation is specified by the GOPATH environment variable.

Use golang's error wrapping and unwinding mechanism for error handling Use golang's error wrapping and unwinding mechanism for error handling Apr 25, 2024 am 08:15 AM

Error handling in Go includes wrapping errors and unwrapping errors. Wrapping errors allows one error type to be wrapped with another, providing a richer context for the error. Expand errors and traverse the nested error chain to find the lowest-level error for easy debugging. By combining these two technologies, error conditions can be effectively handled, providing richer error context and better debugging capabilities.

See all articles