wrote some socket functions
This commit is contained in:
		| @ -1,7 +1,7 @@ | ||||
| # Makefile.in generated by automake 1.15 from Makefile.am. | ||||
| # Makefile.in generated by automake 1.14.1 from Makefile.am. | ||||
| # @configure_input@ | ||||
|  | ||||
| # Copyright (C) 1994-2014 Free Software Foundation, Inc. | ||||
| # Copyright (C) 1994-2013 Free Software Foundation, Inc. | ||||
|  | ||||
| # This Makefile.in is free software; the Free Software Foundation | ||||
| # gives unlimited permission to copy and/or distribute it, | ||||
| @ -16,17 +16,7 @@ | ||||
|  | ||||
|  | ||||
| VPATH = @srcdir@ | ||||
| am__is_gnu_make = { \ | ||||
|   if test -z '$(MAKELEVEL)'; then \ | ||||
|     false; \ | ||||
|   elif test -n '$(MAKE_HOST)'; then \ | ||||
|     true; \ | ||||
|   elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ | ||||
|     true; \ | ||||
|   else \ | ||||
|     false; \ | ||||
|   fi; \ | ||||
| } | ||||
| am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' | ||||
| am__make_running_with_option = \ | ||||
|   case $${target_option-} in \ | ||||
|       ?) ;; \ | ||||
| @ -91,19 +81,20 @@ build_triplet = @build@ | ||||
| host_triplet = @host@ | ||||
| @ENABLE_CXX_TRUE@am__append_1 = libqsesixx.la | ||||
| subdir = lib/si | ||||
| DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ | ||||
| 	$(top_srcdir)/ac/depcomp $(noinst_HEADERS) | ||||
| ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 | ||||
| am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_sign.m4 \ | ||||
| am__aclocal_m4_deps = $(top_srcdir)/m4/argz.m4 \ | ||||
| 	$(top_srcdir)/m4/ax_check_sign.m4 \ | ||||
| 	$(top_srcdir)/m4/ax_cxx_namespace.m4 \ | ||||
| 	$(top_srcdir)/m4/ax_lib_mysql.m4 $(top_srcdir)/m4/ax_numval.m4 \ | ||||
| 	$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/libtool.m4 \ | ||||
| 	$(top_srcdir)/m4/ltargz.m4 $(top_srcdir)/m4/ltdl.m4 \ | ||||
| 	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ | ||||
| 	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ | ||||
| 	$(top_srcdir)/m4/ltdl.m4 $(top_srcdir)/m4/ltoptions.m4 \ | ||||
| 	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ | ||||
| 	$(top_srcdir)/m4/lt~obsolete.m4 \ | ||||
| 	$(top_srcdir)/m4/lx_find_mpi.m4 $(top_srcdir)/configure.ac | ||||
| am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ | ||||
| 	$(ACLOCAL_M4) | ||||
| DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ | ||||
| 	$(am__DIST_COMMON) | ||||
| mkinstalldirs = $(install_sh) -d | ||||
| CONFIG_HEADER = $(top_builddir)/include/qse/config.h | ||||
| CONFIG_CLEAN_FILES = | ||||
| @ -251,12 +242,12 @@ am__define_uniq_tagged_files = \ | ||||
|   done | $(am__uniquify_input)` | ||||
| ETAGS = etags | ||||
| CTAGS = ctags | ||||
| am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/ac/depcomp | ||||
| DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) | ||||
| ACLOCAL = @ACLOCAL@ | ||||
| AMTAR = @AMTAR@ | ||||
| AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ | ||||
| AR = @AR@ | ||||
| ARGZ_H = @ARGZ_H@ | ||||
| AUTOCONF = @AUTOCONF@ | ||||
| AUTOHEADER = @AUTOHEADER@ | ||||
| AUTOMAKE = @AUTOMAKE@ | ||||
| @ -311,11 +302,9 @@ LTDLDEPS = @LTDLDEPS@ | ||||
| LTDLINCL = @LTDLINCL@ | ||||
| LTDLOPEN = @LTDLOPEN@ | ||||
| LTLIBOBJS = @LTLIBOBJS@ | ||||
| LT_ARGZ_H = @LT_ARGZ_H@ | ||||
| LT_CONFIG_H = @LT_CONFIG_H@ | ||||
| LT_DLLOADERS = @LT_DLLOADERS@ | ||||
| LT_DLPREOPEN = @LT_DLPREOPEN@ | ||||
| LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ | ||||
| MAKEINFO = @MAKEINFO@ | ||||
| MANIFEST_TOOL = @MANIFEST_TOOL@ | ||||
| MKDIR_P = @MKDIR_P@ | ||||
| @ -505,6 +494,7 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps) | ||||
| 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/si/Makefile'; \ | ||||
| 	$(am__cd) $(top_srcdir) && \ | ||||
| 	  $(AUTOMAKE) --foreign lib/si/Makefile | ||||
| .PRECIOUS: Makefile | ||||
| Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status | ||||
| 	@case '$?' in \ | ||||
| 	  *config.status*) \ | ||||
| @ -1084,8 +1074,6 @@ uninstall-am: uninstall-libLTLIBRARIES | ||||
| 	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ | ||||
| 	tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES | ||||
|  | ||||
| .PRECIOUS: Makefile | ||||
|  | ||||
|  | ||||
| # Tell versions [3.59,3.63) of GNU make to not export all variables. | ||||
| # Otherwise a system limit (for SysV at least) may be exceeded. | ||||
|  | ||||
| @ -32,13 +32,16 @@ | ||||
| #include <stdarg.h> | ||||
| #include <errno.h> | ||||
| #include <string.h> | ||||
| #include <fcntl.h> | ||||
| #include <unistd.h> | ||||
|  | ||||
| ///////////////////////////////// | ||||
| QSE_BEGIN_NAMESPACE(QSE) | ||||
| ///////////////////////////////// | ||||
|  | ||||
| Socket::Socket () QSE_CPP_NOEXCEPT: handle(QSE_INVALID_SCKHND) | ||||
| Socket::Socket () QSE_CPP_NOEXCEPT: handle(QSE_INVALID_SCKHND), errcode(E_NOERR) | ||||
| { | ||||
| 	this->errmsg[0] = QSE_T('\0'); | ||||
| } | ||||
|  | ||||
| Socket::~Socket () QSE_CPP_NOEXCEPT | ||||
| @ -60,6 +63,7 @@ void Socket::setError (ErrorCode error_code, const qse_char_t* fmt, ...) | ||||
| 		QSE_T("no error"), | ||||
| 		QSE_T("insufficient memory"), | ||||
| 		QSE_T("invalid parameter"), | ||||
| 		QSE_T("in progress"), | ||||
| 		QSE_T("socket not open"), | ||||
| 		QSE_T("system error") | ||||
| 	}; | ||||
| @ -78,18 +82,58 @@ void Socket::setError (ErrorCode error_code, const qse_char_t* fmt, ...) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| int Socket::open (int domain, int type, int protocol) QSE_CPP_NOEXCEPT | ||||
| int Socket::open (int domain, int type, int protocol, int traits) QSE_CPP_NOEXCEPT | ||||
| { | ||||
| 	int x; | ||||
| 	bool fcntl_v = 0; | ||||
|  | ||||
| #if defined(SOCK_NONBLOCK) && defined(SOCK_CLOEXEC) | ||||
| 	if (traits & T_NONBLOCK) type |= SOCK_NONBLOCK; | ||||
| 	if (traits & T_CLOEXEC) type |= SOCK_CLOEXEC; | ||||
| open_socket: | ||||
| #endif | ||||
| 	x = ::socket (domain, type, protocol); | ||||
| 	if (x != -1) | ||||
| 	if (x == -1) | ||||
| 	{ | ||||
| 		this->close (); | ||||
| 		this->handle = x; | ||||
| 	#if defined(SOCK_NONBLOCK) && defined(SOCK_CLOEXEC) | ||||
| 		if (errno == EINVAL && (type & (SOCK_NONBLOCK | SOCK_CLOEXEC))) | ||||
| 		{ | ||||
| 			type &= ~(SOCK_NONBLOCK | SOCK_CLOEXEC); | ||||
| 			if (traits & T_NONBLOCK ) fcntl_v |= O_NONBLOCK; | ||||
| 			if (traits & T_CLOEXEC) fcntl_v |= O_CLOEXEC; | ||||
| 			goto open_socket; | ||||
| 		} | ||||
| 	#endif | ||||
| 		this->set_error_with_syserr (errno); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	return x; | ||||
| #if defined(SOCK_NONBLOCK) && defined(SOCK_CLOEXEC) | ||||
| 	// do nothing | ||||
| #else | ||||
| 	if (traits & T_NONBLOCK ) fcntl_v |= O_NONBLOCK; | ||||
| 	if (traits & T_CLOEXEC) fcntl_v |= O_CLOEXEC; | ||||
| #endif | ||||
|  | ||||
| 	if (fcntl_v) | ||||
| 	{ | ||||
| 		int fl = fcntl(x, F_GETFL, 0); | ||||
| 		if (fl == -1) | ||||
| 		{ | ||||
| 		fcntl_failure: | ||||
| 			this->set_error_with_syserr (errno); | ||||
| 			::close (x); | ||||
| 			x = -1; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			if (fcntl(x, F_SETFL, fl | fcntl_v) == -1) goto fcntl_failure; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	this->close (); | ||||
| 	this->handle = x; | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| void Socket::close () QSE_CPP_NOEXCEPT | ||||
| @ -103,11 +147,7 @@ void Socket::close () QSE_CPP_NOEXCEPT | ||||
|  | ||||
| int Socket::connect (const SocketAddress& target) QSE_CPP_NOEXCEPT | ||||
| { | ||||
| 	if (this->handle == QSE_INVALID_SCKHND) | ||||
| 	{ | ||||
| 		this->setError (Socket::E_NOTOPEN); | ||||
| 		return -1; | ||||
| 	} | ||||
| 	QSE_ASSERT (this->handle != QSE_INVALID_SCKHND); | ||||
|  | ||||
| 	if (::connect(this->handle, (struct sockaddr*)target.getAddrPtr(), target.getAddrSize()) == -1) | ||||
| 	{ | ||||
| @ -120,11 +160,7 @@ int Socket::connect (const SocketAddress& target) QSE_CPP_NOEXCEPT | ||||
|  | ||||
| int Socket::bind (const SocketAddress& target) QSE_CPP_NOEXCEPT | ||||
| { | ||||
| 	if (this->handle == QSE_INVALID_SCKHND) | ||||
| 	{ | ||||
| 		this->setError (Socket::E_NOTOPEN); | ||||
| 		return -1; | ||||
| 	} | ||||
| 	QSE_ASSERT (this->handle != QSE_INVALID_SCKHND); | ||||
|  | ||||
| 	if (::bind(this->handle, (struct sockaddr*)target.getAddrPtr(), target.getAddrSize()) == -1) | ||||
| 	{ | ||||
| @ -135,15 +171,12 @@ int Socket::bind (const SocketAddress& target) QSE_CPP_NOEXCEPT | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| int Socket::accept (Socket* newsck, SocketAddress* newaddr, int flags) QSE_CPP_NOEXCEPT | ||||
| int Socket::accept (Socket* newsck, SocketAddress* newaddr, int traits) QSE_CPP_NOEXCEPT | ||||
| { | ||||
| 	int n; | ||||
|  | ||||
| 	if (this->handle == QSE_INVALID_SCKHND) | ||||
| 	{ | ||||
| 		this->setError (Socket::E_NOTOPEN); | ||||
| 		return -1; | ||||
| 	} | ||||
| 	QSE_ASSERT (this->handle != QSE_INVALID_SCKHND); | ||||
|  | ||||
| #if 0 | ||||
| 	qse_socklen_t len = newaddr->getAddrSize(); | ||||
|  | ||||
| @ -158,6 +191,65 @@ int Socket::accept (Socket* newsck, SocketAddress* newaddr, int flags) QSE_CPP_N | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| qse_ssize_t Socket::send (const void* buf, qse_size_t len) QSE_CPP_NOEXCEPT | ||||
| { | ||||
| 	QSE_ASSERT (this->handle != QSE_INVALID_SCKHND); | ||||
|  | ||||
| 	qse_ssize_t n = ::send(this->handle, buf, len, 0); | ||||
| 	if (n == -1) | ||||
| 	{ | ||||
| 		this->set_error_with_syserr (errno); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	return n;  | ||||
| } | ||||
|  | ||||
| qse_ssize_t Socket::send (const void* buf, qse_size_t len, const SocketAddress& dstaddr) QSE_CPP_NOEXCEPT | ||||
| { | ||||
| 	QSE_ASSERT (this->handle != QSE_INVALID_SCKHND); | ||||
|  | ||||
| 	qse_ssize_t n = ::sendto(this->handle, buf, len, 0, (struct sockaddr*)dstaddr.getAddrPtr(), dstaddr.getAddrSize()); | ||||
| 	if (n == -1) | ||||
| 	{ | ||||
| 		this->set_error_with_syserr (errno); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	return n;  | ||||
| } | ||||
|  | ||||
| qse_ssize_t Socket::receive (void* buf, qse_size_t len) QSE_CPP_NOEXCEPT | ||||
| { | ||||
| 	QSE_ASSERT (this->handle != QSE_INVALID_SCKHND); | ||||
|  | ||||
| 	qse_ssize_t n = ::recv(this->handle, buf, len, 0); | ||||
| 	if (n == -1) | ||||
| 	{ | ||||
| 		this->set_error_with_syserr (errno); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	return n;  | ||||
| } | ||||
|  | ||||
| qse_ssize_t Socket::receive (void* buf, qse_size_t len, SocketAddress& srcaddr) QSE_CPP_NOEXCEPT | ||||
| { | ||||
| 	QSE_ASSERT (this->handle != QSE_INVALID_SCKHND); | ||||
|  | ||||
| 	qse_sklen_t addrlen = srcaddr.getAddrCapa(); | ||||
| 	qse_ssize_t n = ::recvfrom(this->handle, buf, len, 0, (struct sockaddr*)srcaddr.getAddrPtr(), &addrlen); | ||||
| 	if (n == -1) | ||||
| 	{ | ||||
| 		this->set_error_with_syserr (errno); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	return n;  | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| void Socket::set_error_with_syserr (int syserr) | ||||
| { | ||||
| 	qse_mchar_t buf[128]; | ||||
| @ -173,6 +265,10 @@ void Socket::set_error_with_syserr (int syserr) | ||||
| 			errcode = this->E_NOMEM; | ||||
| 			break; | ||||
|  | ||||
| 		case EINPROGRESS: | ||||
| 			errcode = this->E_INPROG; | ||||
| 			break; | ||||
|  | ||||
| // TODO: translate more system error codes | ||||
|  | ||||
| 		default: | ||||
|  | ||||
| @ -94,6 +94,7 @@ union sockaddr_t | ||||
|  | ||||
| typedef union sockaddr_t sockaddr_t; | ||||
|  | ||||
| /* | ||||
| #if defined(AF_INET) | ||||
| #	define FAMILY(x) (((struct sockaddr_in*)(x))->sin_family) | ||||
| #elif defined(AF_INET6) | ||||
| @ -103,6 +104,9 @@ typedef union sockaddr_t sockaddr_t; | ||||
| #else | ||||
| #	define FAMILY(x) (-1) | ||||
| #endif | ||||
| */ | ||||
|  | ||||
| #define FAMILY(x) (((qse_skad_t*)x)->u.family) | ||||
|  | ||||
| static QSE_INLINE int skad_to_nwad (const sockaddr_t* skad, qse_nwad_t* nwad) | ||||
| { | ||||
|  | ||||
		Reference in New Issue
	
	Block a user