swoole版本:1.7.6-stable
上一章已经分析了如何启动swServer的相关函数。本章将继续分析swServer的相关函数,
1.swServer函数分析
swServer_addListener
该函数用于在swServer中添加一个需要监听的host及port。函数原型如下:
// Server.h 438h
int swServer_addListener(swServer *serv, int type, char *host,int port);
参数 | 说明 |
---|---|
swServer *serv | swServer对象 |
int type | 创建的socket类型,见枚举swSocket_type |
char* host | 监听地址 |
int port | 监听端口 |
函数核心源码:
// Server.c 900~943h
swListenList_node *listen_host = SwooleG.memory_pool->alloc(SwooleG.memory_pool, sizeof(swListenList_node));
listen_host->type = type;
listen_host->port = port;
listen_host->sock = 0;
listen_host->ssl = 0;
bzero(listen_host->host, SW_HOST_MAXSIZE);
strncpy(listen_host->host, host, SW_HOST_MAXSIZE);
LL_APPEND(serv->listen_list, listen_host);
//UDP需要提前创建好
if (type == SW_SOCK_UDP || type == SW_SOCK_UDP6 || type == SW_SOCK_UNIX_DGRAM)
{
int sock = swSocket_listen(type, listen_host->host, port, serv->backlog);
if (sock < 0)
{
return SW_ERR;
}
//设置UDP缓存区尺寸,高并发UDP服务器必须设置
int bufsize = serv->udp_sock_buffer_size;
setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &bufsize, sizeof(bufsize));
setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &bufsize, sizeof(bufsize));
listen_host->sock = sock;
serv->have_udp_sock = 1;
}
else
{
if (type & SW_SOCK_SSL)
{
type = type & (~SW_SOCK_SSL);
listen_host->type