Apollo 10.0
自动驾驶开放平台
tcp_echo_server.cc 文件参考
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
#include "cyber/cyber.h"
#include "cyber/init.h"
#include "cyber/io/session.h"
#include "cyber/scheduler/scheduler_factory.h"
#include "cyber/task/task.h"
#include "cyber/time/time.h"
tcp_echo_server.cc 的引用(Include)关系图:

浏览源代码.

函数

void Echo (const std::shared_ptr< Session > &session)
 
int main (int argc, char *argv[])
 

函数说明

◆ Echo()

void Echo ( const std::shared_ptr< Session > &  session)

在文件 tcp_echo_server.cc35 行定义.

35 {
36 std::vector<char> recv_buffer(2049);
37 int nbytes = 0;
38 while ((nbytes = static_cast<int>(
39 session->Recv(recv_buffer.data(), recv_buffer.size(), 0))) > 0) {
40 session->Write(recv_buffer.data(), nbytes);
41 }
42
43 if (nbytes == 0) {
44 std::cout << "client has been closed." << std::endl;
45 session->Close();
46 }
47
48 if (nbytes < 0) {
49 std::cout << "receive from client failed." << std::endl;
50 session->Close();
51 }
52}

◆ main()

int main ( int  argc,
char *  argv[] 
)

在文件 tcp_echo_server.cc54 行定义.

54 {
55 if (argc != 2) {
56 std::cout << "Usage: " << argv[0] << " <server port>" << std::endl;
57 return -1;
58 }
59
60 apollo::cyber::Init(argv[0]);
61
62 uint16_t server_port = static_cast<uint16_t>(atoi(argv[1]));
64 [&server_port]() {
65 struct sockaddr_in server_addr;
66 server_addr.sin_family = AF_INET;
67 server_addr.sin_addr.s_addr = htons(INADDR_ANY);
68 server_addr.sin_port = htons(server_port);
69
70 Session session;
71 session.Socket(AF_INET, SOCK_STREAM, 0);
72 if (session.Bind((struct sockaddr*)&server_addr, sizeof(server_addr)) <
73 0) {
74 std::cout << "bind to port[" << server_port << "] failed."
75 << std::endl;
76 return;
77 }
78 session.Listen(10);
79 auto conn_session = session.Accept((struct sockaddr*)nullptr, nullptr);
80 std::cout << "accepted" << std::endl;
81 auto routine_name =
82 "connected session" + std::to_string(Time::Now().ToNanosecond());
84 std::bind(Echo, conn_session), routine_name);
85 },
86 "echo_server");
87
89 return 0;
90}
static Time Now()
get the current time.
Definition time.cc:57
int Listen(int backlog)
Definition session.cc:43
int Bind(const struct sockaddr *addr, socklen_t addrlen)
Definition session.cc:48
SessionPtr Accept(struct sockaddr *addr, socklen_t *addrlen)
Definition session.cc:54
int Socket(int domain, int type, int protocol)
Definition session.cc:31
bool CreateTask(const RoutineFactory &factory, const std::string &name)
Definition scheduler.cc:37
void WaitForShutdown()
Definition state.h:50
bool Init(const char *binary_name, const std::string &dag_info)
Definition init.cc:98
void Echo(const std::shared_ptr< Session > &session)