If a connection is dropped as the result of keep-alives the error code WSAENETRESET is returned to any calls in progress on the socket, and any subsequent calls will fail with WSAENOTCONN.
/** * struct lws_context_creation_info - parameters to create context with * * This is also used to create vhosts.... if LWS_SERVER_OPTION_EXPLICIT_VHOSTS * is not given, then for backwards compatibility one vhost is created at * context-creation time using the info from this struct. * * If LWS_SERVER_OPTION_EXPLICIT_VHOSTS is given, then no vhosts are created * at the same time as the context, they are expected to be created afterwards. * * @port: VHOST: Port to listen on... you can use CONTEXT_PORT_NO_LISTEN to * suppress listening on any port, that's what you want if you are * not running a websocket server at all but just using it as a * client * @iface: VHOST: NULL to bind the listen socket to all interfaces, or the * interface name, eg, "eth2" * If options specifies LWS_SERVER_OPTION_UNIX_SOCK, this member is * the pathname of a UNIX domain socket. you can use the UNIX domain * sockets in abstract namespace, by prepending an @ symbole to the * socket name. * @protocols: VHOST: Array of structures listing supported protocols and a protocol- * specific callback for each one. The list is ended with an * entry that has a NULL callback pointer. * It's not const because we write the owning_server member * @extensions: VHOST: NULL or array of lws_extension structs listing the * extensions this context supports. If you configured with * --without-extensions, you should give NULL here. * @token_limits: CONTEXT: NULL or struct lws_token_limits pointer which is initialized * with a token length limit for each possible WSI_TOKEN_*** * @ssl_cert_filepath: VHOST: If libwebsockets was compiled to use ssl, and you want * to listen using SSL, set to the filepath to fetch the * server cert from, otherwise NULL for unencrypted * @ssl_private_key_filepath: VHOST: filepath to private key if wanting SSL mode; * if this is set to NULL but sll_cert_filepath is set, the * OPENSSL_CONTEXT_REQUIRES_PRIVATE_KEY callback is called * to allow setting of the private key directly via openSSL * library calls * @ssl_ca_filepath: VHOST: CA certificate filepath or NULL * @ssl_cipher_list: VHOST: List of valid ciphers to use (eg, * "RC4-MD5:RC4-SHA:AES128-SHA:AES256-SHA:HIGH:!DSS:!aNULL" * or you can leave it as NULL to get "DEFAULT" * @http_proxy_address: VHOST: If non-NULL, attempts to proxy via the given address. * If proxy auth is required, use format * "username:password@server:port" * @http_proxy_port: VHOST: If http_proxy_address was non-NULL, uses this port at * the address * @gid: CONTEXT: group id to change to after setting listen socket, or -1. * @uid: CONTEXT: user id to change to after setting listen socket, or -1. * @options: VHOST + CONTEXT: 0, or LWS_SERVER_OPTION_... bitfields * @user: CONTEXT: optional user pointer that can be recovered via the context * pointer using lws_context_user * @ka_time: CONTEXT: 0 for no keepalive, otherwise apply this keepalive timeout to * all libwebsocket sockets, client or server * @ka_probes: CONTEXT: if ka_time was nonzero, after the timeout expires how many * times to try to get a response from the peer before giving up * and killing the connection * @ka_interval: CONTEXT: if ka_time was nonzero, how long to wait before each ka_probes * attempt * @provided_client_ssl_ctx: CONTEXT: If non-null, swap out libwebsockets ssl * implementation for the one provided by provided_ssl_ctx. * Libwebsockets no longer is responsible for freeing the context * if this option is selected. * @max_http_header_data: CONTEXT: The max amount of header payload that can be handled * in an http request (unrecognized header payload is dropped) * @max_http_header_pool: CONTEXT: The max number of connections with http headers that * can be processed simultaneously (the corresponding memory is * allocated for the lifetime of the context). If the pool is * busy new incoming connections must wait for accept until one * becomes free. * @count_threads: CONTEXT: how many contexts to create in an array, 0 = 1 * @fd_limit_per_thread: CONTEXT: nonzero means restrict each service thread to this * many fds, 0 means the default which is divide the process fd * limit by the number of threads. * @timeout_secs: VHOST: various processes involving network roundtrips in the * library are protected from hanging forever by timeouts. If * nonzero, this member lets you set the timeout used in seconds. * Otherwise a default timeout is used. * @ecdh_curve: VHOST: if NULL, defaults to initializing server with "prime256v1" * @vhost_name: VHOST: name of vhost, must match external DNS name used to * access the site, like "warmcat.com" as it's used to match * Host: header and / or SNI name for SSL. * @plugin_dirs: CONTEXT: NULL, or NULL-terminated array of directories to * scan for lws protocol plugins at context creation time * @pvo: VHOST: pointer to optional linked list of per-vhost * options made accessible to protocols * @keepalive_timeout: VHOST: (default = 0 = 60s) seconds to allow remote * client to hold on to an idle HTTP/1.1 connection * @log_filepath: VHOST: filepath to append logs to... this is opened before * any dropping of initial privileges * @mounts: VHOST: optional linked list of mounts for this vhost * @server_string: CONTEXT: string used in HTTP headers to identify server * software, if NULL, "libwebsockets". */ struct lws_context_creation_info { int port; /* VH */ const char *iface; /* VH */ const struct lws_protocols *protocols; /* VH */ const struct lws_extension *extensions; /* VH */ const struct lws_token_limits *token_limits; /* context */ const char *ssl_private_key_password; /* VH */ const char *ssl_cert_filepath; /* VH */ const char *ssl_private_key_filepath; /* VH */ const char *ssl_ca_filepath; /* VH */ const char *ssl_cipher_list; /* VH */ const char *http_proxy_address; /* VH */ unsigned int http_proxy_port; /* VH */ int gid; /* context */ int uid; /* context */ unsigned int options; /* VH + context */ void *user; /* context */ int ka_time; /* context */ int ka_probes; /* context */ int ka_interval; /* context */ #ifdef LWS_OPENSSL_SUPPORT SSL_CTX *provided_client_ssl_ctx; /* context */ #else /* maintain structure layout either way */ void *provided_client_ssl_ctx; #endif short max_http_header_data; /* context */ short max_http_header_pool; /* context */ unsigned int count_threads; /* context */ unsigned int fd_limit_per_thread; /* context */ unsigned int timeout_secs; /* VH */ const char *ecdh_curve; /* VH */ const char *vhost_name; /* VH */ const char * const *plugin_dirs; /* context */ const struct lws_protocol_vhost_options *pvo; /* VH */ int keepalive_timeout; /* VH */ const char *log_filepath; /* VH */ const struct lws_http_mount *mounts; /* VH */ const char *server_string; /* context */ /* Add new things just above here ---^ * This is part of the ABI, don't needlessly break compatibility * * The below is to ensure later library versions with new * members added above will see 0 (default) even if the app * was not built against the newer headers. */ void *_unused[8]; };
On a blocking socket, the return value indicates success or failure of the connection attempt.
对于阻塞式的socket,通过connect的返回值就能确定有没有连接成功,返回0表示连接成功。
With a nonblocking socket, the connection attempt cannot be completed immediately. In this case, connect will return SOCKET_ERROR, and WSAGetLastError will return WSAEWOULDBLOCK. In this case, there are three possible scenarios:
Use the select function to determine the completion of the connection request by checking to see if the socket is writeable.
// 设置连接超时时间为1秒 timeval tv; tv.tv_sec = 1; //超时1s tv.tv_usec = 0; // The select function returns the total number of socket handles that are ready and contained // in the fd_set structures, zero if the time limit expired, or SOCKET_ERROR(-1) if an error occurred. if (select(0, NULL, &writefds, NULL, &tv) <= 0) { closesocket(connSock); return false; //超时未连接上就退出 }
发表评论