とりあえず送受信だけに興味があるので、色々しらべ、SSL_write()関数
が送信しているらしいことはつかみました。
そこで、SSL_write()の実装を見てみたのですが、(下記)
int SSL_write(SSL *s,const void *buf,int num)
{
if (s->handshake_func == 0)
{
SSLerr(SSL_F_SSL_WRITE, SSL_R_UNINITIALIZED);
return -1;
}
if (s->shutdown & SSL_SENT_SHUTDOWN)
{
s->rwstate=SSL_NOTHING;
SSLerr(SSL_F_SSL_WRITE,SSL_R_PROTOCOL_IS_SHUTDOWN);
return(-1);
}
return(s->method->ssl_write(s,buf,num)); //ssl_write()関数が実際の送信を担う…??
}
メンバ関数らしいssl_write()関数のラッパになっていたようです。
さらに、ssl_write()関数の実装を見てみたところ(下記)、ssl_write()関数内部で
SSL_write()関数が呼ばれていました。
static int ssl_write(BIO *b, const char *out, int outl)
{
int ret,r=0;
int retry_reason=0;
SSL *ssl;
BIO_SSL *bs;
if (out == NULL) return(0);
bs=(BIO_SSL *)b->ptr;
ssl=bs->ssl;
BIO_clear_retry_flags(b);
/* ret=SSL_do_handshake(ssl);
if (ret > 0) */
ret=SSL_write(ssl,out,outl); //ラッパであるはずのSSL_write()を呼んでいる…??
switch (SSL_get_error(ssl,ret)) //以下はエラー処理か
{
case SSL_ERROR_NONE:
if (ret <= 0) break;
if (bs->renegotiate_count > 0)
{
bs->byte_count+=ret;
if (bs->byte_count > bs->renegotiate_count)
{
bs->byte_count=0;
bs->num_renegotiates++;
SSL_renegotiate(ssl);
r=1;
}
}
if ((bs->renegotiate_timeout > 0) && (!r))
{
unsigned long tm;
tm=(unsigned long)time(NULL);
if (tm > bs->last_time+bs->renegotiate_timeout)
{
bs->last_time=tm;
bs->num_renegotiates++;
SSL_renegotiate(ssl);
}
}
break;
case SSL_ERROR_WANT_WRITE:
BIO_set_retry_write(b);
break;
case SSL_ERROR_WANT_READ:
BIO_set_retry_read(b);
break;
case SSL_ERROR_WANT_X509_LOOKUP:
BIO_set_retry_special(b);
retry_reason=BIO_RR_SSL_X509_LOOKUP;
break;
case SSL_ERROR_WANT_CONNECT:
BIO_set_retry_special(b);
retry_reason=BIO_RR_CONNECT;
case SSL_ERROR_SYSCALL:
case SSL_ERROR_SSL:
default:
break;
}
b->retry_reason=retry_reason;
return(ret);
}
送信部分の実装にたどり着けなくなってしまいました。
どのように送信しているのか(及び、受信しているのか)知りたいのですが、
分からなくなってしましました。
正しい解釈を教えていただけたら幸いです。
(!)自分のコードではないので掲載していてまずければ、削除いたします。