Added some socket functions
This commit is contained in:
@ -25,7 +25,13 @@
|
||||
*/
|
||||
|
||||
#include <qse/si/Socket.hpp>
|
||||
#include <qse/cmn/str.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <stdarg.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
/////////////////////////////////
|
||||
QSE_BEGIN_NAMESPACE(QSE)
|
||||
@ -47,6 +53,31 @@ int Socket::fdopen (int handle) QSE_CPP_NOEXCEPT
|
||||
}
|
||||
#endif
|
||||
|
||||
void Socket::setError (ErrorCode error_code, const qse_char_t* fmt, ...)
|
||||
{
|
||||
static const qse_char_t* errstr[] =
|
||||
{
|
||||
QSE_T("no error"),
|
||||
QSE_T("insufficient memory"),
|
||||
QSE_T("invalid parameter"),
|
||||
QSE_T("socket not open"),
|
||||
QSE_T("system error")
|
||||
};
|
||||
|
||||
this->errcode = error_code;
|
||||
if (fmt)
|
||||
{
|
||||
va_list ap;
|
||||
va_start (ap, fmt);
|
||||
qse_strxvfmt (this->errmsg, QSE_COUNTOF(errmsg), fmt, ap);
|
||||
va_end (ap);
|
||||
}
|
||||
else
|
||||
{
|
||||
qse_strxcpy (this->errmsg, QSE_COUNTOF(errmsg), errstr[error_code]);
|
||||
}
|
||||
}
|
||||
|
||||
int Socket::open (int domain, int type, int protocol) QSE_CPP_NOEXCEPT
|
||||
{
|
||||
int x;
|
||||
@ -72,16 +103,85 @@ void Socket::close () QSE_CPP_NOEXCEPT
|
||||
|
||||
int Socket::connect (const SocketAddress& target) QSE_CPP_NOEXCEPT
|
||||
{
|
||||
//if (this->handle == QSE_INVALID_SCKHND)
|
||||
//{
|
||||
//
|
||||
//}
|
||||
if (this->handle == QSE_INVALID_SCKHND)
|
||||
{
|
||||
this->setError (Socket::E_NOTOPEN);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return -1;
|
||||
if (::connect(this->handle, (struct sockaddr*)target.getAddrPtr(), target.getAddrSize()) == -1)
|
||||
{
|
||||
this->set_error_with_syserr (errno);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int Socket::beginConnect (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;
|
||||
}
|
||||
|
||||
if (::bind(this->handle, (struct sockaddr*)target.getAddrPtr(), target.getAddrSize()) == -1)
|
||||
{
|
||||
this->set_error_with_syserr (errno);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int Socket::accept (Socket* newsck, SocketAddress* newaddr, int flags) QSE_CPP_NOEXCEPT
|
||||
{
|
||||
int n;
|
||||
|
||||
if (this->handle == QSE_INVALID_SCKHND)
|
||||
{
|
||||
this->setError (Socket::E_NOTOPEN);
|
||||
return -1;
|
||||
}
|
||||
#if 0
|
||||
qse_socklen_t len = newaddr->getAddrSize();
|
||||
|
||||
if ((n = ::accept4 (this->handle, newaddr->getAddrPtr(), &len)) == -1)
|
||||
{
|
||||
this->set_error_with_syserr (errno);
|
||||
return -1;
|
||||
}
|
||||
|
||||
newsck->handle = n;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Socket::set_error_with_syserr (int syserr)
|
||||
{
|
||||
qse_mchar_t buf[128];
|
||||
ErrorCode errcode;
|
||||
|
||||
switch (errno)
|
||||
{
|
||||
case EINVAL:
|
||||
errcode = this->E_INVAL;
|
||||
break;
|
||||
|
||||
case ENOMEM:
|
||||
errcode = this->E_NOMEM;
|
||||
break;
|
||||
|
||||
// TODO: translate more system error codes
|
||||
|
||||
default:
|
||||
strerror_r(errno, buf, QSE_COUNTOF(buf));
|
||||
this->setError (this->E_SYSERR, QSE_T("%hs"), buf);
|
||||
return;
|
||||
}
|
||||
|
||||
this->setError (errcode);
|
||||
}
|
||||
|
||||
/////////////////////////////////
|
||||
|
@ -111,14 +111,6 @@ SocketAddress::SocketAddress (const qse_nwad_t* nwad)
|
||||
this->set (nwad);
|
||||
}
|
||||
|
||||
SocketAddress::SocketAddress (const struct sockaddr* ptr, int len)
|
||||
{
|
||||
if (this->set (ptr, len) <= -1)
|
||||
{
|
||||
QSE_MEMSET (&this->skad, 0, QSE_SIZEOF(this->skad));
|
||||
}
|
||||
}
|
||||
|
||||
int SocketAddress::getFamily () const
|
||||
{
|
||||
return FAMILY(&this->skad);
|
||||
@ -206,14 +198,6 @@ int SocketAddress::set (const qse_nwad_t* nwad)
|
||||
return qse_nwadtoskad (nwad, &this->skad);
|
||||
}
|
||||
|
||||
int SocketAddress::set (const struct sockaddr* ptr, int len)
|
||||
{
|
||||
int exp_size = qse_skadsize((const qse_skad_t*)ptr);
|
||||
if (len < exp_size) return -1;
|
||||
QSE_MEMCPY (&this->skad, ptr, exp_size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/////////////////////////////////
|
||||
QSE_END_NAMESPACE(QSE)
|
||||
|
@ -255,7 +255,7 @@ int qse_getnwifcfg (qse_nwifcfg_t* cfg)
|
||||
head->flags |= QSE_NWIFCFG_PTOP;
|
||||
}
|
||||
|
||||
if (ioctl (s, SIOCGLIFINDEX, &ifrbuf) <= -1) goto oops;
|
||||
if (ioctl (s, SIOCGLIFINDEX, &ifrbuf) <= -1) goto oops;
|
||||
head->index = ifrbuf.lifr_index;
|
||||
|
||||
if (ioctl (s, SIOCGLIFNETMASK, &ifrbuf) <= -1) goto oops;
|
||||
|
Reference in New Issue
Block a user