test_server.cc 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. /**
  2. * cmake .
  3. * make test_server
  4. * ./bin/test_server
  5. */
  6. #include "swoole_server.h"
  7. #include "swoole_util.h"
  8. using namespace swoole;
  9. int my_onPacket(swServer *serv, swRecvData *req);
  10. int my_onReceive(swServer *serv, swRecvData *req);
  11. void my_onStart(swServer *serv);
  12. void my_onShutdown(swServer *serv);
  13. void my_onConnect(swServer *serv, swDataHead *info);
  14. void my_onClose(swServer *serv, swDataHead *info);
  15. void my_onWorkerStart(swServer *serv, int worker_id);
  16. void my_onWorkerStop(swServer *serv, int worker_id);
  17. static int g_receive_count = 0;
  18. int main(int argc, char **argv) {
  19. swoole_init();
  20. sw_logger()->set_date_format("%F %T");
  21. sw_logger()->set_date_with_microseconds(true);
  22. Server serv(Server::MODE_BASE);
  23. serv.reactor_num = 4;
  24. serv.worker_num = 1;
  25. serv.set_max_connection(10000);
  26. // serv.open_cpu_affinity = 1;
  27. // serv.open_tcp_nodelay = 1;
  28. // serv.daemonize = 1;
  29. // memcpy(serv.log_file, SW_STRS("/tmp/swoole.log"));
  30. serv.dispatch_mode = 2;
  31. // serv.open_tcp_keepalive = 1;
  32. #ifdef HAVE_OPENSSL
  33. // serv.ssl_cert_file = "tests/ssl/ssl.crt";
  34. // serv.ssl_key_file = "tests/ssl/ssl.key";
  35. // serv.open_ssl = 1;
  36. #endif
  37. serv.onStart = my_onStart;
  38. serv.onShutdown = my_onShutdown;
  39. serv.onConnect = my_onConnect;
  40. serv.onReceive = my_onReceive;
  41. serv.onPacket = my_onPacket;
  42. serv.onClose = my_onClose;
  43. serv.onWorkerStart = my_onWorkerStart;
  44. serv.onWorkerStop = my_onWorkerStop;
  45. // swSignal_set(SIGINT, user_signal);
  46. serv.add_port(SW_SOCK_UDP, "0.0.0.0", 9502);
  47. serv.add_port(SW_SOCK_TCP6, "::", 9503);
  48. serv.add_port(SW_SOCK_UDP6, "::", 9504);
  49. swListenPort *port = serv.add_port(SW_SOCK_TCP, "127.0.0.1", 9501);
  50. if (!port) {
  51. swWarn("listen failed, [error=%d]", swoole_get_last_error());
  52. exit(2);
  53. }
  54. port->open_eof_check = 0;
  55. // config
  56. port->backlog = 128;
  57. memcpy(port->protocol.package_eof, SW_STRL("\r\n\r\n"));
  58. if (serv.create()) {
  59. swWarn("create server fail[error=%d]", swoole_get_last_error());
  60. exit(1);
  61. }
  62. if (serv.start() < 0) {
  63. swWarn("start server fail[error=%d]", swoole_get_last_error());
  64. exit(3);
  65. }
  66. return 0;
  67. }
  68. void my_onWorkerStart(swServer *serv, int worker_id) {
  69. swNotice("WorkerStart[%d]PID=%d", worker_id, getpid());
  70. }
  71. void my_onWorkerStop(swServer *serv, int worker_id) {
  72. swNotice("WorkerStop[%d]PID=%d", worker_id, getpid());
  73. }
  74. int my_onReceive(swServer *serv, swRecvData *req) {
  75. char req_data[SW_IPC_BUFFER_SIZE];
  76. char resp_data[SW_IPC_BUFFER_SIZE];
  77. g_receive_count++;
  78. swConnection *conn = serv->get_connection_by_session_id(req->info.fd);
  79. memcpy(req_data, req->data, req->info.len);
  80. swoole::rtrim(req_data, req->info.len);
  81. swNotice("onReceive[%d]: ip=%s|port=%d Data=%s|Len=%d",
  82. g_receive_count,
  83. conn->info.get_ip(),
  84. conn->info.get_port(),
  85. req_data,
  86. req->info.len);
  87. int n = sw_snprintf(resp_data, SW_IPC_BUFFER_SIZE, "Server: %.*s\n", req->info.len, req_data);
  88. if (!serv->send(req->info.fd, resp_data, n)) {
  89. swNotice("send to client fail. errno=%d", errno);
  90. } else {
  91. swNotice("send %d bytes to client success. data=%s", n, resp_data);
  92. }
  93. return SW_OK;
  94. }
  95. int my_onPacket(swServer *serv, swRecvData *req) {
  96. char address[256];
  97. int port = 0;
  98. int ret = 0;
  99. DgramPacket *packet = (DgramPacket *) req->data;
  100. auto serv_socket = serv->get_server_socket(req->info.server_fd);
  101. if (packet->socket_type == SW_SOCK_UDP) {
  102. inet_ntop(AF_INET, &packet->socket_addr.addr.inet_v4.sin_addr, address, sizeof(address));
  103. port = ntohs(packet->socket_addr.addr.inet_v4.sin_port);
  104. } else if (packet->socket_type == SW_SOCK_UDP6) {
  105. inet_ntop(AF_INET6, &packet->socket_addr.addr.inet_v6.sin6_addr, address, sizeof(address));
  106. port = ntohs(packet->socket_addr.addr.inet_v6.sin6_port);
  107. } else if (packet->socket_type == SW_SOCK_UNIX_DGRAM) {
  108. strcpy(address, packet->socket_addr.addr.un.sun_path);
  109. } else {
  110. abort();
  111. }
  112. char *data = packet->data;
  113. uint32_t length = packet->length;
  114. swNotice("Packet[client=%s:%d, %d bytes]: data=%.*s", address, port, length, length, data);
  115. char resp_data[SW_IPC_BUFFER_SIZE];
  116. int n = sw_snprintf(resp_data, SW_IPC_BUFFER_SIZE, "Server: %.*s", length, data);
  117. ret = serv_socket->sendto(address, port, resp_data, n);
  118. if (ret < 0) {
  119. swNotice("send to client fail. errno=%d", errno);
  120. } else {
  121. swNotice("send %d bytes to client success. data=%s", n, resp_data);
  122. }
  123. return SW_OK;
  124. }
  125. void my_onStart(swServer *serv) {
  126. swNotice("Server is running");
  127. }
  128. void my_onShutdown(swServer *serv) {
  129. swNotice("Server is shutdown");
  130. }
  131. void my_onConnect(swServer *serv, swDataHead *info) {
  132. swNotice("PID=%d\tConnect fd=%ld|reactor_id=%d", getpid(), info->fd, info->reactor_id);
  133. }
  134. void my_onClose(swServer *serv, swDataHead *info) {
  135. swNotice("PID=%d\tClose fd=%ld|reactor_id=%d", getpid(), info->fd, info->reactor_id);
  136. }