Äúµ±Ç°µÄλÖãºÊ×Ò³ > IT±à³Ì > C++
| CÓïÑÔ | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | ѧÊõÓë´úÂë | cnn¾í»ýÉñ¾­ÍøÂç | gnn | ͼÏñÐÞ¸´ | Keras | Êý¾Ý¼¯ | Neo4j | ×ÔÈ»ÓïÑÔ´¦Àí | Éî¶Èѧϰ | ҽѧCAD | ҽѧӰÏñ | ³¬²ÎÊý | pointnet | pytorch | Òì³£¼ì²â | Transformers | Çé¸Ð·ÖÀà | ֪ʶͼÆ× |

×Ôѧ½Ì³Ì£ºC++ BIO_new_socketº¯Êý´úÂëʾÀý

51×ÔÑ§Íø 2021-06-01 19:50:07
  C++
ÕâÆª½Ì³ÌC++ BIO_new_socketº¯Êý´úÂëʾÀýдµÃºÜʵÓã¬Ï£ÍûÄܰﵽÄú¡£

±¾ÎÄÕûÀí»ã×ÜÁËC++ÖÐBIO_new_socketº¯ÊýµÄµäÐÍÓ÷¨´úÂëʾÀý¡£Èç¹ûÄúÕý¿àÓÚÒÔÏÂÎÊÌ⣺C++ BIO_new_socketº¯ÊýµÄ¾ßÌåÓ÷¨£¿C++ BIO_new_socketÔõôÓã¿C++ BIO_new_socketʹÓõÄÀý×Ó£¿ÄÇô¹§Ï²Äú, ÕâÀᆱѡµÄº¯Êý´úÂëʾÀý»òÐí¿ÉÒÔΪÄúÌṩ°ïÖú¡£

ÔÚÏÂÎÄÖÐÒ»¹²Õ¹Ê¾ÁËBIO_new_socketº¯ÊýµÄ28¸ö´úÂëʾÀý£¬ÕâЩÀý×ÓĬÈϸù¾ÝÊÜ»¶Ó­³Ì¶ÈÅÅÐò¡£Äú¿ÉÒÔΪϲ»¶»òÕ߸оõÓÐÓõĴúÂëµãÔÞ£¬ÄúµÄÆÀ¼Û½«ÓÐÖúÓÚÎÒÃǵÄÏµÍ³ÍÆ¼ö³ö¸ü°ôµÄC++´úÂëʾÀý¡£

ʾÀý1: ssl_setup_socket

/** Associate an SSL object with a socket and return it. * /param sock socket descriptor to associate with an SSL object. * /return pointer to SSL object. */SSL *ssl_setup_socket(int sock){  SSL *ssl;  BIO *bio;  ssl = SSL_new(ctx);  bio = BIO_new_socket(sock, BIO_NOCLOSE);  BIO_set_nbio(bio, 1);  SSL_set_bio(ssl, bio, bio);  return ssl;}
¿ª·¢ÕßID:tkrajcar£¬ÏîÄ¿Ãû³Æ:pypenn£¬´úÂëÐÐÊý:16£¬


ʾÀý2: ssl_setup_socket

/** Associate an SSL object with a socket and return it. * /param sock socket descriptor to associate with an SSL object. * /return pointer to SSL object. */SSL *ssl_setup_socket(int sock){  SSL *ssl;  BIO *bio;  ssl = ssl_alloc_struct();  bio = BIO_new_socket(sock, BIO_NOCLOSE);  BIO_set_nbio(bio, 1);  SSL_set_bio(ssl, bio, bio);  return ssl;}
¿ª·¢ÕßID:zetafunction£¬ÏîÄ¿Ãû³Æ:pennmush-mirror£¬´úÂëÐÐÊý:16£¬


ʾÀý3: SSL_new

SSL *ssl_new(SSL_CTX *ctx,int s){  BIO *sbio;  SSL *ssl;  ssl = SSL_new(ctx);  if (!ssl) return 0;  sbio = BIO_new_socket(s,BIO_NOCLOSE);  if (!sbio) return 0;  SSL_set_bio(ssl,sbio,sbio);  return ssl;}
¿ª·¢ÕßID:Safari77£¬ÏîÄ¿Ãû³Æ:ucspi-ssl-fehcom£¬´úÂëÐÐÊý:12£¬


ʾÀý4: protocol_ssl_accept

static protocol_t *protocol_ssl_accept(protocol_t * p, void *options){	protocol_t *newp;	struct sockaddr_in remote;	socklen_t addrlen;	int ret;	ssl_private_t *ssl_p = (ssl_private_t *) p->_protocol_p;	ssl_private_t *new_ssl_p;	struct sockaddr name;	char hostname[128];	flowop_options_t *flowop_options = (flowop_options_t *) options;	BIO *sbio;	newp = protocol_ssl_new();	new_ssl_p = (ssl_private_t *) newp->_protocol_p;	addrlen = (socklen_t) sizeof (remote);	uperf_debug("ssl - ssl obj waiting for accept/n");	newp->fd = accept(p->fd, (struct sockaddr *) &remote,		&addrlen);	if (newp->fd < 0) {		uperf_log_msg(UPERF_LOG_ERROR, errno, "accept");		return (NULL);	}	if (getnameinfo((const struct sockaddr *) & remote, addrlen,			hostname, sizeof (hostname), NULL, 0, 0) == 0) {		uperf_debug("ssl - Connection from %s:%d/n", hostname,			SOCK_PORT(remote));		strlcpy(newp->host, hostname, sizeof (newp->host));		newp->port = SOCK_PORT(remote);	}	if (flowop_options) {		if ((load_engine(flowop_options->engine)) == -1) {			uperf_info("ssl - Engine %s does NOT exist! Using the default OpenSSL softtoken",			flowop_options->engine);		}	}	sbio = BIO_new_socket(newp->fd, BIO_NOCLOSE);	if (!(new_ssl_p->ssl = SSL_new(ctx))) {		uperf_log_msg(UPERF_LOG_ERROR, 0, "SSL_new error");		return (NULL);	}	SSL_set_bio(new_ssl_p->ssl, sbio, sbio);	ret = SSL_accept(new_ssl_p->ssl);	if (my_ssl_error(new_ssl_p->ssl, ret) == 0) {		return (newp);	} else {		return (0);	}}
¿ª·¢ÕßID:FPiriz£¬ÏîÄ¿Ãû³Æ:uperf£¬´úÂëÐÐÊý:52£¬


ʾÀý5: main

/* Main Entry */int main(int argc, char **argv){	// init connection object	Connection conn;	memset(&conn, 0, sizeof(conn));	conn.port = PORT; // assign default port	conn.host = HOST;	// Parse arguments	parseArguments(argc, argv, &conn);	// init SSL library	conn.sslContext = initSSLContext(CLIENT_CERTIFICATE, CA_CERTIFICATE);	SSL_CTX_set_options(conn.sslContext, SSL_OP_NO_SSLv2);	SSL_CTX_set_cipher_list(conn.sslContext, "SHA1");	// Connect	if (tcpConnect(&conn) < 0){		tcpDisconnect(&conn);		exit(0);	}	SSL * ssl = SSL_new(conn.sslContext);	BIO * sbio = BIO_new_socket(conn.socket, BIO_NOCLOSE);	SSL_set_bio(ssl, sbio, sbio);	int ret;	ret = SSL_connect(ssl);	if (ret <= 0){		printf(FMT_CONNECT_ERR);		handleError(ssl, ret);	}	else{		// Process Message		if (checkServerCertification(ssl) == OK){			processMessage(ssl);		}	}	// close ssl connection	if (!SSL_shutdown(ssl)){		tcpDisconnect(&conn);		SSL_shutdown(ssl);	}	SSL_free(ssl);	// Disconnect	tcpDisconnect(&conn);	destroySSLContext(conn.sslContext);	return 1;}
¿ª·¢ÕßID:zd2100£¬ÏîÄ¿Ãû³Æ:ECE568£¬´úÂëÐÐÊý:52£¬


ʾÀý6: SSL_new

void sslsocket::complete_secure_connect(){    // create SSL and BIO objects and then initialize ssl client mode.    // setup SSL session now that we have TCP connection.    SSL_CTX* ctx = context_.ssl();    ssl_ = SSL_new(ctx);    if (!ssl_)        throw std::runtime_error("SSL_new failed");    // create new IO object    bio_ = BIO_new_socket(socket_, BIO_NOCLOSE);    if (!bio_)        throw std::runtime_error("BIO_new_socket failed");    // connect the IO object with SSL, this takes the ownership    // of the BIO object.    SSL_set_bio(ssl_, bio_, bio_);    ERR_clear_error();    // go into client mode.    while (true)    {        const int ret = SSL_connect(ssl_);        if (ret == 1)            break;        const int err = SSL_get_error(ssl_, ret);        switch (err)        {            case SSL_ERROR_WANT_READ:                ssl_wait_read();                break;            case SSL_ERROR_WANT_WRITE:                ssl_wait_write();                break;            case SSL_ERROR_SYSCALL:                if (ret == -1)                    throw std::system_error(get_last_socket_error(),                         "SSL socket I/O error");                // fallthrough intended            default:                throw std::runtime_error("SSL_connect failed");        }    }}
¿ª·¢ÕßID:ensisoft£¬ÏîÄ¿Ãû³Æ:newsflash-plus£¬´úÂëÐÐÊý:50£¬


ʾÀý7: hssl_server_ssl

herror_thssl_server_ssl(hsocket_t * sock){  SSL *ssl;  int ret;  BIO *sbio;  if (!enabled)    return H_OK;  log_verbose2("Starting SSL initialization for socket %d", sock->sock);  if (!(ssl = SSL_new(context)))  {    log_warn1("SSL_new failed");    return herror_new("hssl_server_ssl", HSSL_ERROR_SERVER,                      "Cannot create SSL object");  }  /* SSL_set_fd(ssl, sock->sock); */  sbio = BIO_new_socket(sock->sock, BIO_NOCLOSE);  if (sbio == NULL)  {    log_error1("BIO_new_socket failed");    return NULL;  }  // BIO_set_callback(sbio, hssl_bio_cb);  sbio->method->bread = _hssl_bio_read;  SSL_set_bio(ssl, sbio, sbio);  if ((ret = SSL_accept(ssl)) <= 0)  {    herror_t err;    log_error2("SSL_accept failed (%s)", _hssl_get_error(ssl, ret));    err =      herror_new("hssl_server_ssl", HSSL_ERROR_SERVER,                 "SSL_accept failed (%s)", _hssl_get_error(ssl, ret));    SSL_free(ssl);    return err;  }  sock->ssl = ssl;  return H_OK;}
¿ª·¢ÕßID:GENI-GEMINI£¬ÏîÄ¿Ãû³Æ:LAMP£¬´úÂëÐÐÊý:50£¬


ʾÀý8: PetscSSLInitializeContext

/*@C      PetscHTTPSConnect - connect to a HTTPS server    Input Parameters:+    host - the name of the machine hosting the HTTPS server.    port - the port number where the server is hosting, usually 443-    ctx - value obtained with PetscSSLInitializeContext()    Output Parameters:+    sock - socket to connect-    ssl - the argument passed to PetscHTTPSRequest()    Level: advanced.seealso: PetscOpenSocket(), PetscHTTPSRequest(), PetscSSLInitializeContext()@*/PetscErrorCode PetscHTTPSConnect(const char host[],int port,SSL_CTX *ctx,int *sock,SSL **ssl){  BIO            *sbio;  PetscErrorCode ierr;  PetscFunctionBegin;  /* Connect the TCP socket*/  ierr = PetscOpenSocket(host,port,sock);CHKERRQ(ierr);  /* Connect the SSL socket */  *ssl = SSL_new(ctx);  sbio = BIO_new_socket(*sock,BIO_NOCLOSE);  SSL_set_bio(*ssl,sbio,sbio);  if (SSL_connect(*ssl) <= 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"SSL connect error");  PetscFunctionReturn(0);}
¿ª·¢ÕßID:firedrakeproject£¬ÏîÄ¿Ãû³Æ:petsc£¬´úÂëÐÐÊý:32£¬


ʾÀý9: kTLSAccept

int kTLSAccept(int handle,void **tlsssl,void **tlssession){  BIO *bio;  SSL *ssl;  int ofcmode;  bool flg;  if(!TLSctx){return(RETURN_NG);}  /* ¤¹¤Ç¤Ë´æÔÚ¤¹¤ë¥½¥±¥Ã¥È¤òÓ䤤ÆBIO¥ª¥Ö¥¸¥§¥¯¥È¤òÉú³É¤¹¤ë¡£BIO¥ª¥Ö¥¸¥§¥¯¥È¤¬ÆÆ
C++ BIO_pendingº¯Êý´úÂëʾÀý
C++ BIO_new_mem_bufº¯Êý´úÂëʾÀý
ÍòÊÂOK×ÔÑ§Íø£º51×ÔÑ§Íø_Èí¼þ×ÔÑ§Íø_CAD×ÔÑ§Íø×Ôѧexcel¡¢×ÔѧPS¡¢×ÔѧCAD¡¢×ÔѧCÓïÑÔ¡¢×Ôѧcss3ʵÀý£¬ÊÇÒ»¸öͨ¹ýÍøÂç×ÔÖ÷ѧϰ¹¤×÷¼¼ÄܵÄ×Ôѧƽ̨£¬ÍøÓÑϲ»¶µÄÈí¼þ×ÔÑ§ÍøÕ¾¡£