int swSocket_bind(int type, char *host, int port) { int sock; int ret; struct sockaddr_in addr_in4; struct sockaddr_in6 addr_in6; struct sockaddr_un addr_un; sock = swSocket_create(type); if (sock < 0) { swSysError("create socket failed."); return SW_ERR; } int option = 1; if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(int)) < 0) { swSysError("setsockopt(%d, SO_REUSEADDR) failed.", sock); } //unix socket if (type == SW_SOCK_UNIX_DGRAM || type == SW_SOCK_UNIX_STREAM) { bzero(&addr_un, sizeof(addr_un)); unlink(host); addr_un.sun_family = AF_UNIX; strcpy(addr_un.sun_path, host); ret = bind(sock, (struct sockaddr*) &addr_un, sizeof(addr_un)); } //IPv6 else if (type > SW_SOCK_UDP) { bzero(&addr_in6, sizeof(addr_in6)); inet_pton(AF_INET6, host, &(addr_in6.sin6_addr)); addr_in6.sin6_port = htons(port); addr_in6.sin6_family = AF_INET6; ret = bind(sock, (struct sockaddr *) &addr_in6, sizeof(addr_in6)); } //IPv4 else { bzero(&addr_in4, sizeof(addr_in4)); inet_pton(AF_INET, host, &(addr_in4.sin_addr)); addr_in4.sin_port = htons(port); addr_in4.sin_family = AF_INET; ret = bind(sock, (struct sockaddr *) &addr_in4, sizeof(addr_in4)); } //bind failed if (ret < 0) { swWarn("bind(%s:%d) failed. Error: %s [%d]", host, port, strerror(errno), errno); return SW_ERR; } if (type == SW_SOCK_UDP || type == SW_SOCK_UDP6 || type == SW_SOCK_UNIX_DGRAM) { return sock; } swSetNonBlock(sock); return sock; }
int swSocket_listen(int type, char *host, int port, int backlog) { int sock; int option; int ret; struct sockaddr_in addr_in4; struct sockaddr_in6 addr_in6; sock = swSocket_create(type); if (sock < 0) { swWarn("swSocket_listen: Create socket fail.type=%d|Errno=%d", type, errno); return SW_ERR; } //reuse option = 1; setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(int)); //IPv6 if (type > SW_SOCK_UDP) { bzero(&addr_in6, sizeof(addr_in6)); inet_pton(AF_INET6, host, &(addr_in6.sin6_addr)); addr_in6.sin6_port = htons(port); addr_in6.sin6_family = AF_INET6; ret = bind(sock, (struct sockaddr *) &addr_in6, sizeof(addr_in6)); } //IPv4 else { bzero(&addr_in4, sizeof(addr_in4)); inet_pton(AF_INET, host, &(addr_in4.sin_addr)); addr_in4.sin_port = htons(port); addr_in4.sin_family = AF_INET; ret = bind(sock, (struct sockaddr *) &addr_in4, sizeof(addr_in4)); } //将监听套接字同sockaddr绑定 if (ret < 0) { swWarn("bind fail.type=%d|host=%s|port=%d|Errno=%d\n", type, host, port, errno); return SW_ERR; } if (type == SW_SOCK_UDP || type == SW_SOCK_UDP6) { return sock; } //开始监听套接字 ret = listen(sock, backlog); if (ret < 0) { swWarn("Listen fail.type=%d|host=%s|port=%d|Errno=%d\n", type, host, port, errno); return SW_ERR; } swSetNonBlock(sock); return sock; }
int swSocket_create_server(int type, char *address, int port, int backlog) { #if 0 int type; char host[32]; int port = 0; if (strncasecmp(address, "unix:/", 6) == 0) { address += 5; type = SW_SOCK_UNIX_STREAM; } else { char *port_str = strchr(address, ':'); if (!port_str) { swoole_error_log(SW_LOG_ERROR, SW_ERROR_INVALID_PARAMS, "invalid address[%s]", address); return SW_ERR; } type = SW_SOCK_TCP6; memcpy(host, address, port_str - address); host[port_str - address] = 0; port = atoi(port_str + 1); address = host; } #endif int fd = swSocket_create(type); if (fd < 0) { swoole_error_log(SW_LOG_ERROR, SW_ERROR_SYSTEM_CALL_FAIL, "socket() failed. Error: %s[%d]", strerror(errno), errno); return SW_ERR; } if (swSocket_bind(fd, type, address, &port) < 0) { close(fd); return SW_ERR; } if (listen(fd, backlog) < 0) { swoole_error_log(SW_LOG_ERROR, SW_ERROR_SYSTEM_CALL_FAIL, "listen(%s:%d, %d) failed. Error: %s[%d]", address, port, backlog, strerror(errno), errno); close(fd); return SW_ERR; } return fd; }
int swSocket_listen(int type, char *host, int port, int backlog) { int sock; int option; int ret; struct sockaddr_in addr_in4; struct sockaddr_in6 addr_in6; struct sockaddr_un addr_un; sock = swSocket_create(type); if (sock < 0) { swWarn("swSocket_listen: Create socket fail.type=%d|Errno=%d", type, errno); return SW_ERR; } //reuse option = 1; setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(int)); //unix socket if (type == SW_SOCK_UNIX_DGRAM || type == SW_SOCK_UNIX_STREAM) { bzero(&addr_un, sizeof(addr_un)); unlink(host); addr_un.sun_family = AF_UNIX; strcpy(addr_un.sun_path, host); ret = bind(sock, (struct sockaddr*)&addr_un, sizeof(addr_un)); } //IPv6 else if (type > SW_SOCK_UDP) { bzero(&addr_in6, sizeof(addr_in6)); inet_pton(AF_INET6, host, &(addr_in6.sin6_addr)); addr_in6.sin6_port = htons(port); addr_in6.sin6_family = AF_INET6; ret = bind(sock, (struct sockaddr *) &addr_in6, sizeof(addr_in6)); } //IPv4 else { bzero(&addr_in4, sizeof(addr_in4)); inet_pton(AF_INET, host, &(addr_in4.sin_addr)); addr_in4.sin_port = htons(port); addr_in4.sin_family = AF_INET; ret = bind(sock, (struct sockaddr *) &addr_in4, sizeof(addr_in4)); } //bind failed if (ret < 0) { swWarn("Bind failed. type=%d|host=%s|port=%d. Error: %s [%d]", type, host, port, strerror(errno), errno); return SW_ERR; } if (type == SW_SOCK_UDP || type == SW_SOCK_UDP6 || type == SW_SOCK_UNIX_DGRAM) { return sock; } //listen stream socket ret = listen(sock, backlog); if (ret < 0) { swWarn("Listen fail.type=%d|host=%s|port=%d. Error: %s [%d]", type, host, port, strerror(errno), errno); return SW_ERR; } swSetNonBlock(sock); return sock; }
int swSocket_listen(int type, char *host, int port, int backlog) { int sock; int option; int ret; struct sockaddr_in addr_in4; struct sockaddr_in6 addr_in6; struct sockaddr_un addr_un; sock = swSocket_create(type); if (sock < 0) { swSysError("create socket failed."); return SW_ERR; } //reuse address option = 1; if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(int)) < 0) { swSysError("setsockopt(SO_REUSEPORT) failed."); } //reuse port #ifdef HAVE_REUSEPORT if (SwooleG.reuse_port) { if (setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, &option, sizeof(int)) < 0) { swSysError("setsockopt(SO_REUSEPORT) failed."); SwooleG.reuse_port = 0; } } #endif //unix socket if (type == SW_SOCK_UNIX_DGRAM || type == SW_SOCK_UNIX_STREAM) { bzero(&addr_un, sizeof(addr_un)); unlink(host); addr_un.sun_family = AF_UNIX; strcpy(addr_un.sun_path, host); ret = bind(sock, (struct sockaddr*) &addr_un, sizeof(addr_un)); } //IPv6 else if (type > SW_SOCK_UDP) { bzero(&addr_in6, sizeof(addr_in6)); inet_pton(AF_INET6, host, &(addr_in6.sin6_addr)); addr_in6.sin6_port = htons(port); addr_in6.sin6_family = AF_INET6; ret = bind(sock, (struct sockaddr *) &addr_in6, sizeof(addr_in6)); } //IPv4 else { bzero(&addr_in4, sizeof(addr_in4)); inet_pton(AF_INET, host, &(addr_in4.sin_addr)); addr_in4.sin_port = htons(port); addr_in4.sin_family = AF_INET; ret = bind(sock, (struct sockaddr *) &addr_in4, sizeof(addr_in4)); } //bind failed if (ret < 0) { swWarn("bind(%s:%d) failed. Error: %s [%d]", host, port, strerror(errno), errno); return SW_ERR; } if (type == SW_SOCK_UDP || type == SW_SOCK_UDP6 || type == SW_SOCK_UNIX_DGRAM) { return sock; } //listen stream socket ret = listen(sock, backlog); if (ret < 0) { swWarn("listen(%s:%d, %d) failed. Error: %s[%d]", host, port, backlog, strerror(errno), errno); return SW_ERR; } swSetNonBlock(sock); return sock; }