diff --git a/mio/bin/t01.c b/mio/bin/t01.c index cb0021a..7fbed9f 100644 --- a/mio/bin/t01.c +++ b/mio/bin/t01.c @@ -160,13 +160,18 @@ static void tcp_sck_on_disconnect (mio_dev_sck_t* tcp) static void tcp_sck_on_connect (mio_dev_sck_t* tcp) { mio_bch_t buf1[128], buf2[128]; + mio_bch_t k[50000]; mio_iovec_t iov[] = { { "hello", 5 }, { "world", 5 }, - { "mio test", 8 } + { k, MIO_COUNTOF(k) }, + { "mio test", 8 }, + { k, MIO_COUNTOF(k) } }; + int i; + mio_skadtobcstr (tcp->mio, &tcp->localaddr, buf1, MIO_COUNTOF(buf1), MIO_SKAD_TO_BCSTR_ADDR | MIO_SKAD_TO_BCSTR_PORT); mio_skadtobcstr (tcp->mio, &tcp->remoteaddr, buf2, MIO_COUNTOF(buf2), MIO_SKAD_TO_BCSTR_ADDR | MIO_SKAD_TO_BCSTR_PORT); @@ -179,6 +184,15 @@ static void tcp_sck_on_connect (mio_dev_sck_t* tcp) MIO_INFO3 (tcp->mio, "DEVICE accepted client device... .LOCAL %hs REMOTE %hs SCK: %d\n", buf1, buf2, tcp->sck); } + for (i = 0; i < MIO_COUNTOF(k); i++) k[i] = 'A' + (i % 26); + +/* + { + int sndbuf = 2000; + mio_dev_sck_setsockopt(tcp, SOL_SOCKET, SO_SNDBUF, &sndbuf, MIO_SIZEOF(sndbuf)); + } +*/ + if (mio_dev_sck_writev(tcp, iov, MIO_COUNTOF(iov), MIO_NULL, MIO_NULL) <= -1) { mio_dev_sck_halt (tcp); diff --git a/mio/lib/mio-sck.h b/mio/lib/mio-sck.h index 0be2ad0..d27ebae 100644 --- a/mio/lib/mio-sck.h +++ b/mio/lib/mio-sck.h @@ -514,6 +514,21 @@ static MIO_INLINE int mio_dev_sck_timedread (mio_dev_sck_t* sck, int enabled, mi +MIO_EXPORT int mio_dev_sck_setsockopt ( + mio_dev_sck_t* dev, + int level, + int optname, + void* optval, + mio_scklen_t optlen +); + +MIO_EXPORT int mio_dev_sck_getsockopt ( + mio_dev_sck_t* dev, + int level, + int optname, + void* optval, + mio_scklen_t* optlen +); MIO_EXPORT mio_uint16_t mio_checksumip ( const void* hdr, diff --git a/mio/lib/mio.c b/mio/lib/mio.c index aa3ea62..5f80b93 100644 --- a/mio/lib/mio.c +++ b/mio/lib/mio.c @@ -1331,7 +1331,7 @@ static int __dev_writev (mio_dev_t* dev, mio_iovec_t* iov, mio_iolen_t iovcnt, c backup_index = index; } - iov[index].iov_ptr = (void*)((mio_uint8_t*)iov[index].iov_ptr + x); + iov[index].iov_ptr = (void*)((mio_uint8_t*)iov[index].iov_ptr + dcnt); iov[index].iov_len -= dcnt; } while (1); diff --git a/mio/lib/sck.c b/mio/lib/sck.c index 8c922d7..4ee0538 100644 --- a/mio/lib/sck.c +++ b/mio/lib/sck.c @@ -554,10 +554,11 @@ static int dev_sck_writev_stateful (mio_dev_t* dev, const mio_iovec_t* iov, mio_ mio_t* mio = dev->mio; mio_dev_sck_t* rdev = (mio_dev_sck_t*)dev; -#if 0 && defined(USE_SSL) +#if defined(USE_SSL) if (rdev->ssl) { int x; + mio_iolen_t i, nwritten; if (*iovcnt <= 0) { @@ -571,16 +572,24 @@ static int dev_sck_writev_stateful (mio_dev_t* dev, const mio_iovec_t* iov, mio_ return 1; } - x = SSL_write((SSL*)rdev->ssl, data, *len); - if (x <= -1) + nwritten = 0; + for (i = 0; i < *iovcnt; i++) { - int err = SSL_get_error ((SSL*)rdev->ssl, x); - if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) return 0; - set_ssl_error (mio, err); - return -1; + /* no SSL_writev. invoke multiple calls to SSL_write(). + * since the write function is for the stateful connection, + * mutiple calls shouldn't really matter */ + x = SSL_write((SSL*)rdev->ssl, iov[i].iov_ptr, iov[i].iov_len); + if (x <= -1) + { + int err = SSL_get_error ((SSL*)rdev->ssl, x); + if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) return 0; + set_ssl_error (mio, err); + return -1; + } + nwritten += x; } - *len = x; + *iovcnt = nwritten; } else { @@ -624,7 +633,7 @@ static int dev_sck_writev_stateful (mio_dev_t* dev, const mio_iovec_t* iov, mio_ } *iovcnt = x; -#if 0 && defined(USE_SSL) +#if defined(USE_SSL) } #endif return 1; @@ -1729,6 +1738,17 @@ int mio_dev_sck_timedwritev (mio_dev_sck_t* dev, mio_iovec_t* iov, mio_iolen_t i } +/* ========================================================================= */ +int mio_dev_sck_setsockopt (mio_dev_sck_t* dev, int level, int optname, void* optval, mio_scklen_t optlen) +{ + return setsockopt(dev->sck, level, optname, optval, optlen); +} + +int mio_dev_sck_getsockopt (mio_dev_sck_t* dev, int level, int optname, void* optval, mio_scklen_t* optlen) +{ + return getsockopt(dev->sck, level, optname, optval, optlen); +} + /* ========================================================================= */ mio_uint16_t mio_checksumip (const void* hdr, mio_oow_t len)