18#include <netinet/in.h>
19#include <sys/socket.h>
35void Echo(
const std::shared_ptr<Session>& session) {
36 std::vector<char> recv_buffer(2049);
38 while ((nbytes =
static_cast<int>(
39 session->Recv(recv_buffer.data(), recv_buffer.size(), 0))) > 0) {
40 session->Write(recv_buffer.data(), nbytes);
44 std::cout <<
"client has been closed." << std::endl;
49 std::cout <<
"receive from client failed." << std::endl;
54int main(
int argc,
char* argv[]) {
56 std::cout <<
"Usage: " << argv[0] <<
" <server port>" << std::endl;
62 uint16_t server_port =
static_cast<uint16_t
>(atoi(argv[1]));
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);
71 session.
Socket(AF_INET, SOCK_STREAM, 0);
72 if (session.
Bind((
struct sockaddr*)&server_addr,
sizeof(server_addr)) <
74 std::cout <<
"bind to port[" << server_port <<
"] failed."
79 auto conn_session = session.
Accept((
struct sockaddr*)
nullptr,
nullptr);
80 std::cout <<
"accepted" << std::endl;
82 "connected session" + std::to_string(
Time::Now().ToNanosecond());
84 std::bind(
Echo, conn_session), routine_name);
Cyber has builtin time type Time.
static Time Now()
get the current time.
int Bind(const struct sockaddr *addr, socklen_t addrlen)
SessionPtr Accept(struct sockaddr *addr, socklen_t *addrlen)
int Socket(int domain, int type, int protocol)
bool CreateTask(const RoutineFactory &factory, const std::string &name)
bool Init(const char *binary_name, const std::string &dag_info)
int main(int argc, char *argv[])
void Echo(const std::shared_ptr< Session > &session)