added Socket::send() that accept a data vector
This commit is contained 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@ | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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)); | ||||
|  | ||||
		Reference in New Issue
	
	Block a user