You've already forked qlg.tsgz.moe
Init Repo
This commit is contained in:
212
vendor/swoole/examples/test_server.c
vendored
Executable file
212
vendor/swoole/examples/test_server.c
vendored
Executable file
@ -0,0 +1,212 @@
|
||||
/**
|
||||
* cmake .
|
||||
* make test_server
|
||||
* ./bin/test_server
|
||||
*/
|
||||
#include "Server.h"
|
||||
|
||||
int my_onPacket(swServer *serv, swEventData *req);
|
||||
int my_onReceive(swServer *serv, swEventData *req);
|
||||
void my_onStart(swServer *serv);
|
||||
void my_onShutdown(swServer *serv);
|
||||
void my_onConnect(swServer *serv, swDataHead *info);
|
||||
void my_onClose(swServer *serv, swDataHead *info);
|
||||
void my_onWorkerStart(swServer *serv, int worker_id);
|
||||
void my_onWorkerStop(swServer *serv, int worker_id);
|
||||
|
||||
static int g_receive_count = 0;
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int ret;
|
||||
swServer serv;
|
||||
swServer_init(&serv); //初始化
|
||||
|
||||
serv.reactor_num = 4; //reactor线程数量
|
||||
serv.worker_num = 2; //worker进程数量
|
||||
|
||||
serv.factory_mode = SW_MODE_BASE;
|
||||
//serv.factory_mode = SW_MODE_SINGLE; //SW_MODE_PROCESS/SW_MODE_THREAD/SW_MODE_BASE/SW_MODE_SINGLE
|
||||
serv.max_connection = 10000;
|
||||
//serv.open_cpu_affinity = 1;
|
||||
//serv.open_tcp_nodelay = 1;
|
||||
//serv.daemonize = 1;
|
||||
// memcpy(serv.log_file, SW_STRL("/tmp/swoole.log")); //日志
|
||||
|
||||
serv.dispatch_mode = 2;
|
||||
// serv.open_tcp_keepalive = 1;
|
||||
|
||||
#ifdef HAVE_OPENSSL
|
||||
//serv.ssl_cert_file = "tests/ssl/ssl.crt";
|
||||
//serv.ssl_key_file = "tests/ssl/ssl.key";
|
||||
//serv.open_ssl = 1;
|
||||
#endif
|
||||
|
||||
serv.onStart = my_onStart;
|
||||
serv.onShutdown = my_onShutdown;
|
||||
serv.onConnect = my_onConnect;
|
||||
serv.onReceive = my_onReceive;
|
||||
serv.onPacket = my_onPacket;
|
||||
serv.onClose = my_onClose;
|
||||
serv.onWorkerStart = my_onWorkerStart;
|
||||
serv.onWorkerStop = my_onWorkerStop;
|
||||
|
||||
// swSignal_add(SIGINT, user_signal);
|
||||
|
||||
//create Server
|
||||
ret = swServer_create(&serv);
|
||||
if (ret < 0)
|
||||
{
|
||||
swTrace("create server fail[error=%d].\n", ret);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
swListenPort *port = swServer_add_port(&serv, SW_SOCK_TCP, "127.0.0.1", 9501);
|
||||
port->open_eof_check = 0;
|
||||
//config
|
||||
port->backlog = 128;
|
||||
memcpy(port->protocol.package_eof, SW_STRL("\r\n\r\n") - 1); //开启eof检测,启用buffer区
|
||||
|
||||
swServer_add_port(&serv, SW_SOCK_UDP, "0.0.0.0", 9502);
|
||||
swServer_add_port(&serv, SW_SOCK_TCP6, "::", 9503);
|
||||
swServer_add_port(&serv, SW_SOCK_UDP6, "::", 9504);
|
||||
|
||||
ret = swServer_start(&serv);
|
||||
if (ret < 0)
|
||||
{
|
||||
swTrace("start server fail[error=%d].\n", ret);
|
||||
exit(0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void my_onWorkerStart(swServer *serv, int worker_id)
|
||||
{
|
||||
printf("WorkerStart[%d]PID=%d\n", worker_id, getpid());
|
||||
}
|
||||
|
||||
void my_onWorkerStop(swServer *serv, int worker_id)
|
||||
{
|
||||
printf("WorkerStop[%d]PID=%d\n", worker_id, getpid());
|
||||
}
|
||||
|
||||
int my_onReceive(swServer *serv, swEventData *req)
|
||||
{
|
||||
int ret;
|
||||
char resp_data[SW_BUFFER_SIZE];
|
||||
|
||||
g_receive_count++;
|
||||
|
||||
swConnection *conn = swWorker_get_connection(serv, req->info.fd);
|
||||
swoole_rtrim(req->data, req->info.len);
|
||||
printf("onReceive[%d]: ip=%s|port=%d Data=%s|Len=%d\n", g_receive_count, swConnection_get_ip(conn),
|
||||
swConnection_get_port(conn), req->data, req->info.len);
|
||||
|
||||
int n = snprintf(resp_data, SW_BUFFER_SIZE, "Server: %*s\n", req->info.len, req->data);
|
||||
ret = serv->send(serv, req->info.fd, resp_data, n);
|
||||
if (ret < 0)
|
||||
{
|
||||
printf("send to client fail. errno=%d\n", errno);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("send %d bytes to client success. data=%s\n", n, resp_data);
|
||||
}
|
||||
return SW_OK;
|
||||
}
|
||||
|
||||
int my_onPacket(swServer *serv, swEventData *req)
|
||||
{
|
||||
swDgramPacket *packet;
|
||||
|
||||
swString *buffer = swWorker_get_buffer(serv, req->info.from_id);
|
||||
packet = (swDgramPacket*) buffer->str;
|
||||
|
||||
int serv_sock = req->info.from_fd;
|
||||
char *data;
|
||||
int length;
|
||||
char address[256];
|
||||
int port = 0;
|
||||
int ret;
|
||||
|
||||
//udp ipv4
|
||||
if (req->info.type == SW_EVENT_UDP)
|
||||
{
|
||||
struct in_addr sin_addr;
|
||||
sin_addr.s_addr = packet->addr.v4.s_addr;
|
||||
char *tmp = inet_ntoa(sin_addr);
|
||||
memcpy(address, tmp, strlen(tmp));
|
||||
data = packet->data;
|
||||
length = packet->length;
|
||||
port = packet->port;
|
||||
}
|
||||
//udp ipv6
|
||||
else if (req->info.type == SW_EVENT_UDP6)
|
||||
{
|
||||
inet_ntop(AF_INET6, &packet->addr.v6, address, sizeof(address));
|
||||
data = packet->data;
|
||||
length = packet->length;
|
||||
port = packet->port;
|
||||
}
|
||||
//unix dgram
|
||||
else if (req->info.type == SW_EVENT_UNIX_DGRAM)
|
||||
{
|
||||
memcpy(address, packet->data, packet->addr.un.path_length);
|
||||
data = packet->data + packet->addr.un.path_length;
|
||||
length = packet->length - packet->addr.un.path_length;
|
||||
}
|
||||
|
||||
printf("Packet[client=%s:%d, %d bytes]: data=%*s\n", address, port, length, length, data);
|
||||
|
||||
char resp_data[SW_BUFFER_SIZE];
|
||||
int n = snprintf(resp_data, SW_BUFFER_SIZE, "Server: %*s", length, data);
|
||||
|
||||
//udp ipv4
|
||||
if (req->info.type == SW_EVENT_UDP)
|
||||
{
|
||||
ret = swSocket_udp_sendto(serv_sock, address, port, resp_data, n);
|
||||
}
|
||||
//udp ipv6
|
||||
else if (req->info.type == SW_EVENT_UDP6)
|
||||
{
|
||||
ret = swSocket_udp_sendto6(serv_sock, address, port, resp_data, n);
|
||||
}
|
||||
//unix dgram
|
||||
else if (req->info.type == SW_EVENT_UNIX_DGRAM)
|
||||
{
|
||||
memcpy(address, packet->data, packet->addr.un.path_length);
|
||||
data = packet->data + packet->addr.un.path_length;
|
||||
length = packet->length - packet->addr.un.path_length;
|
||||
}
|
||||
|
||||
if (ret < 0)
|
||||
{
|
||||
printf("send to client fail. errno=%d\n", errno);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("send %d bytes to client success. data=%s\n", n, resp_data);
|
||||
}
|
||||
|
||||
return SW_OK;
|
||||
}
|
||||
|
||||
void my_onStart(swServer *serv)
|
||||
{
|
||||
sw_log("Server is running");
|
||||
}
|
||||
|
||||
void my_onShutdown(swServer *serv)
|
||||
{
|
||||
sw_log("Server is shutdown\n");
|
||||
}
|
||||
|
||||
void my_onConnect(swServer *serv, swDataHead *info)
|
||||
{
|
||||
printf("PID=%d\tConnect fd=%d|from_id=%d\n", getpid(), info->fd, info->from_id);
|
||||
}
|
||||
|
||||
void my_onClose(swServer *serv, swDataHead *info)
|
||||
{
|
||||
printf("PID=%d\tClose fd=%d|from_id=%d\n", getpid(), info->fd, info->from_id);
|
||||
}
|
Reference in New Issue
Block a user