From f91e8c317038afaf39f40a3794f7adb63961a1d1 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Mon, 22 Oct 2018 14:10:37 +0000 Subject: [PATCH] added Socket::send() that accept a data vector --- qse/include/qse/si/Makefile.in | 1 + qse/include/qse/si/Socket.hpp | 6 +++- qse/lib/si/Socket.cpp | 61 ++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 1 deletion(-) diff --git a/qse/include/qse/si/Makefile.in b/qse/include/qse/si/Makefile.in index b11ceb08..3aafe462 100644 --- a/qse/include/qse/si/Makefile.in +++ b/qse/include/qse/si/Makefile.in @@ -347,6 +347,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ diff --git a/qse/include/qse/si/Socket.hpp b/qse/include/qse/si/Socket.hpp index a322f97d..b80b0afb 100644 --- a/qse/include/qse/si/Socket.hpp +++ b/qse/include/qse/si/Socket.hpp @@ -103,9 +103,13 @@ public: // underlying system calls qse_ssize_t send (const void* buf, qse_size_t len) QSE_CPP_NOEXCEPT; qse_ssize_t send (const void* buf, qse_size_t len, const SocketAddress& dstaddr) QSE_CPP_NOEXCEPT; + qse_ssize_t send (const qse_ioptl_t* vec, int count) QSE_CPP_NOEXCEPT; + qse_ssize_t send (const qse_ioptl_t* vec, int count, const SocketAddress& dstaddr) QSE_CPP_NOEXCEPT; // The sendx() functions sends data as much as it can, possibly with multiple - // underlying system calls. + // underlying system calls. these are useful for stream sockets and may not + // be useful for datagram sockets they may split the given data into more than + // one packet. int sendx (const void* buf, qse_size_t len, qse_size_t* total_sent = QSE_NULL) QSE_CPP_NOEXCEPT; int sendx (const void* buf, qse_size_t len, const SocketAddress& dstaddr, qse_size_t* total_sent = QSE_NULL) QSE_CPP_NOEXCEPT; int sendx (qse_ioptl_t* vec, int count, qse_size_t* total_sent = QSE_NULL) QSE_CPP_NOEXCEPT; diff --git a/qse/lib/si/Socket.cpp b/qse/lib/si/Socket.cpp index 4a978361..7b8f892c 100644 --- a/qse/lib/si/Socket.cpp +++ b/qse/lib/si/Socket.cpp @@ -482,6 +482,67 @@ qse_ssize_t Socket::send (const void* buf, qse_size_t len, const SocketAddress& return n; } +qse_ssize_t Socket::send (const qse_ioptl_t* iov, int count) QSE_CPP_NOEXCEPT +{ + QSE_ASSERT (qse_is_sck_valid(this->handle)); + +#if defined(HAVE_SENDMSG) || defined(HAVE_WRITEV) + ssize_t nwritten; + +#if defined(HAVE_SENDMSG) + struct msghdr msg; + QSE_MEMSET (&msg, 0, QSE_SIZEOF(msg)); + msg.msg_iov = (struct iovec*)iov; + msg.msg_iovlen = count; + nwritten = ::sendmsg(this->handle, &msg, 0); +#else + nwritten = ::writev(this->handle, (const struct iovec*)iov, count); +#endif + if (nwritten <= -1) + { + this->setErrorCode (syserr_to_errnum(errno)); + return -1; + } + + return nwritten; +#else + // TODO: combine to a single buffer .... use sendto.... + this->setErrorCode (E_NOIMPL); + return -1; +#endif +} + +qse_ssize_t Socket::send (const qse_ioptl_t* iov, int count, const SocketAddress& dstaddr) QSE_CPP_NOEXCEPT +{ + QSE_ASSERT (qse_is_sck_valid(this->handle)); + +QSE_ASSERT (qse_is_sck_valid(this->handle)); + +#if defined(HAVE_SENDMSG) + ssize_t nwritten; + + struct msghdr msg; + QSE_MEMSET (&msg, 0, QSE_SIZEOF(msg)); + msg.msg_name = (void*)dstaddr.getAddrPtr(); + msg.msg_namelen = dstaddr.getAddrSize(); + msg.msg_iov = (struct iovec*)iov; + msg.msg_iovlen = count; + nwritten = ::sendmsg(this->handle, &msg, 0); + if (nwritten <= -1) + { + this->setErrorCode (syserr_to_errnum(errno)); + return -1; + } + + return nwritten; +#else + // TODO: combine to a single buffer .... use sendto.... + this->setErrorCode (E_NOIMPL); + return -1; +#endif + return -1; +} + int Socket::sendx (const void* buf, qse_size_t len, qse_size_t* total_sent) QSE_CPP_NOEXCEPT { QSE_ASSERT (qse_is_sck_valid(this->handle));