int swClient_tcp_connect(swClient *cli, char *host, int port, float timeout, int nonblock) { int ret; cli->serv_addr.sin_family = cli->sock_domain; cli->serv_addr.sin_port = htons(port); cli->serv_addr.sin_addr.s_addr = inet_addr(host); cli->timeout = timeout; swSetTimeout(cli->sock, timeout); if(nonblock == 1) { swSetNonBlock(cli->sock); } else { swSetBlock(cli->sock); } while (1) { ret = connect(cli->sock, (struct sockaddr *) (&cli->serv_addr), sizeof(cli->serv_addr)); if (ret < 0) { if (errno == EINTR) { continue; } } break; } return ret; }
int swClient_udp_connect(swClient *cli, char *host, int port, float timeout, int udp_connect) { int ret; char buf[1024]; cli->timeout = timeout; ret = swSetTimeout(cli->sock, timeout); if(ret < 0) { swWarn("setTimeout fail.errno=%d\n", errno); return SW_ERR; } cli->serv_addr.sin_family = cli->sock_domain; cli->serv_addr.sin_port = htons(port); cli->serv_addr.sin_addr.s_addr = inet_addr(host); if(udp_connect != 1) { return SW_OK; } if(connect(cli->sock, (struct sockaddr *) (&cli->serv_addr), sizeof(cli->serv_addr)) == 0) { //清理connect前的buffer数据遗留 while(recv(cli->sock, buf, 1024 , MSG_DONTWAIT) > 0); return SW_OK; } else { return SW_ERR; } }
static int swClient_udp_connect(swClient *cli, char *host, int port, double timeout, int udp_connect) { char buf[1024]; if (swClient_inet_addr(cli, host, port) < 0) { return SW_ERR; } cli->timeout = timeout; if (timeout > 0) { swSetTimeout(cli->connection.fd, timeout); } cli->connection.active = 1; if (cli->type == SW_SOCK_UNIX_DGRAM) { struct sockaddr_un* client_addr = &cli->client_addr.addr.un; sprintf(client_addr->sun_path, "/tmp/swoole-client.%d.%d.sock", getpid(), cli->connection.fd); client_addr->sun_family = AF_UNIX; unlink(client_addr->sun_path); if (bind(cli->connection.fd, (struct sockaddr *) client_addr, sizeof(cli->client_addr.addr.un)) < 0) { swSysError("bind(%s) failed.", client_addr->sun_path); return SW_ERR; } } else if (udp_connect != 1) { return SW_OK; } int bufsize = cli->udp_sock_buffer_size; setsockopt(cli->connection.fd, SOL_SOCKET, SO_SNDBUF, &bufsize, sizeof(bufsize)); setsockopt(cli->connection.fd, SOL_SOCKET, SO_RCVBUF, &bufsize, sizeof(bufsize)); if (connect(cli->connection.fd, (struct sockaddr *) (&cli->server_addr), cli->server_addr.len) == 0) { //清理connect前的buffer数据遗留 while (recv(cli->connection.fd, buf, 1024, MSG_DONTWAIT) > 0); return SW_OK; } else { swSysError("connect() failed."); cli->connection.active = 0; return SW_ERR; } }
int swClient_tcp_connect(swClient *cli, char *host, int port, double timeout, int nonblock) { int ret; cli->serv_addr.sin_family = cli->sock_domain; cli->serv_addr.sin_port = htons(port); if (swClient_inet_addr(cli, host) < 0) { return SW_ERR; } cli->timeout = timeout; if (nonblock == 1) { swSetNonBlock(cli->sock); } else { swSetTimeout(cli->sock, timeout); //block default //swSetBlock(cli->sock); } while (1) { ret = connect(cli->sock, (struct sockaddr *) (&cli->serv_addr), sizeof(cli->serv_addr)); if (ret < 0) { if (errno == EINTR) { continue; } } break; } if (ret >= 0) { cli->connected = 1; } return ret; }
static int swClient_tcp_connect(swClient *cli, char *host, int port, double timeout, int nonblock) { int ret; cli->timeout = timeout; if (swClient_inet_addr(cli, host, port) < 0) { return SW_ERR; } if (nonblock == 1) { swSetNonBlock(cli->connection.fd); } else { if (cli->timeout > 0) { swSetTimeout(cli->connection.fd, timeout); } swSetBlock(cli->connection.fd); } while (1) { ret = connect(cli->connection.fd, (struct sockaddr *) &cli->server_addr.addr, cli->server_addr.len); if (ret < 0) { if (errno == EINTR) { continue; } } break; } if (ret >= 0) { cli->connection.active = 1; } return ret; }