目录
1 作用说明
- 客户端: 连续发送n个字符串消息 ("client_msg_n"),
- 服务端: 处理客户端消息, 返回对应的字符串信息("client_msg_n<<handled")
2 代码
2.1 客户端client
main.cpp
#include <iostream>
#include <boost/asio.hpp>
using namespace std;
//client
int main(int argc, char **argv) {
try
{
cout << "client start...." << endl;
//io_service对象
boost::asio::io_service ios;
//创建socket对象
boost::asio::ip::tcp::socket sock(ios);
//创建连接端
boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address::from_string("127.0.0.1"),6688);
//连接
sock.connect(ep);
//定义一个缓冲区
//char data[128];
char msgToServer[256];
char msgFromServer[256];
for(int i = 0; i<3; i++)
{
std::memset(msgToServer, 0x00, sizeof(msgToServer));
std::memset(msgFromServer, 0x00, sizeof(msgFromServer));
string tmp = "client_msg_" + to_string(i);
strcpy(msgToServer, tmp.c_str());
cout << "msgToServer: " << msgToServer <<endl;
boost::asio::write(sock,boost::asio::buffer(msgToServer));
// writing server dealing with the message...
boost::asio::read(sock,boost::asio::buffer(msgFromServer));
cout << "dataHandled: " << msgFromServer << endl;
sleep(1);
}
}
catch (exception& e)
{
cout << e.what()<< endl;
}
std::cout << "Hello, world!" << std::endl;
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
project(socket_test)
SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-std=c++11")
find_package( Boost REQUIRED system)
if(NOT Boost_FOUND)
message("Not found Boost")
endif()
include_directories(${Boost_INCLUDE_DIRS})
add_executable(socket_test main.cpp)
target_link_libraries(socket_test ${Boost_LIBRARIES})
target_link_libraries(${PROJECT_NAME}
-pthread
)
install(TARGETS socket_test RUNTIME DESTINATION bin)
2.2 服务端server
main.cpp
#include <iostream>
#include <boost/asio.hpp>
using namespace std;
int main(int argc, char **argv) {
try
{
cout << "server start..." << endl;
//io_service对象
boost::asio::io_service ios;
//绑定端口6688
boost::asio::ip::tcp::acceptor acceptor(ios,boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(),6688));
cout << acceptor.local_endpoint().address() << endl;
char msgFromClient[256];
char msgToClient[256];
//socket对象
boost::asio::ip::tcp::socket sock(ios);
//阻塞等待socket连接
acceptor.accept(sock);
while (1)
{
//sock.receive(boost::asio::buffer(msgFromClient));
boost::asio::read(sock,boost::asio::buffer(msgFromClient));
cout << "client:" << sock.remote_endpoint().address()
<< "; msgFromClient: " << msgFromClient << endl;
//handle the message form client
string tmp = string(msgFromClient) + "<< handled";
strcpy(msgToClient, tmp.c_str());
//sock.write_some(boost::asio::buffer(msgToClient));
boost::asio::write(sock,boost::asio::buffer(msgToClient));
cout << "msgToClient: " << msgToClient << endl;
}
}
catch (exception& e)
{
cout << "exception: " << e.what() << endl;
}
std::cout << "Hello, world! server" << std::endl;
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(socket_server)
SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-std=c++11")
find_package( Boost REQUIRED system)
if(NOT Boost_FOUND)
message("Not found Boost")
endif()
include_directories(${Boost_INCLUDE_DIRS})
add_executable(socket_server main.cpp)
target_link_libraries(socket_server ${Boost_LIBRARIES})
target_link_libraries(${PROJECT_NAME}
-pthread
)
install(TARGETS socket_server RUNTIME DESTINATION bin)
3 结果
client
client start....
msgToServer: client_msg_0
dataHandled: client_msg_0<< handled
msgToServer: client_msg_1
dataHandled: client_msg_1<< handled
msgToServer: client_msg_2
dataHandled: client_msg_2<< handled
Hello, world!
*** Finished ***
server
server start...
0.0.0.0
client:127.0.0.1; msgFromClient: client_msg_0
msgToClient: client_msg_0<< handled
client:127.0.0.1; msgFromClient: client_msg_1
msgToClient: client_msg_1<< handled
client:127.0.0.1; msgFromClient: client_msg_2
msgToClient: client_msg_2<< handled
exception: read: End of file
Hello, world! server
*** Finished ***