|
@ -14,10 +14,16 @@ class XSUDP : public I_XSUDP { |
|
|
|
|
|
|
|
|
public: |
|
|
public: |
|
|
virtual xs_error_code_t initialize(string ip, int localport) override; |
|
|
virtual xs_error_code_t initialize(string ip, int localport) override; |
|
|
virtual xs_error_code_t sendto(const XsyncNetAdd& to, const char* data, int32_t length) override; |
|
|
|
|
|
virtual xs_error_code_t receive(const char* data, int32_t length, XsyncNetAdd& from, int overtimems) override; |
|
|
|
|
|
|
|
|
virtual xs_error_code_t sendto(const XsyncNetAdd& to, const char* data, int32_t length, int32_t* sendlength) override; |
|
|
|
|
|
virtual xs_error_code_t receive(char* data, int32_t& length, XsyncNetAdd& from, int overtimems) override; |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
const char* fmtip(uint32_t ip) { |
|
|
|
|
|
static char ipstr[16]; |
|
|
|
|
|
sprintf(ipstr, "%d.%d.%d.%d", (ip >> 24) & 0xff, (ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff); |
|
|
|
|
|
return ipstr; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
xs_error_code_t XSUDP::initialize(string ip, int localport) { |
|
|
xs_error_code_t XSUDP::initialize(string ip, int localport) { |
|
|
localadd.sin_family = AF_INET; |
|
|
localadd.sin_family = AF_INET; |
|
|
localadd.sin_addr.s_addr = inet_addr(ip.c_str()); |
|
|
localadd.sin_addr.s_addr = inet_addr(ip.c_str()); |
|
@ -32,17 +38,20 @@ xs_error_code_t XSUDP::initialize(string ip, int localport) { |
|
|
return kxs_ec_success; |
|
|
return kxs_ec_success; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
xs_error_code_t XSUDP::sendto(const XsyncNetAdd& to, const char* data, int32_t length) { |
|
|
|
|
|
|
|
|
xs_error_code_t XSUDP::sendto(const XsyncNetAdd& to, const char* data, int32_t length, int32_t* sendlength) { |
|
|
struct sockaddr_in sockaddr; |
|
|
struct sockaddr_in sockaddr; |
|
|
sockaddr.sin_family = AF_INET; |
|
|
sockaddr.sin_family = AF_INET; |
|
|
sockaddr.sin_addr.s_addr = htonl(to.ip); |
|
|
|
|
|
|
|
|
sockaddr.sin_addr.s_addr = inet_addr(to.ip.c_str()); |
|
|
sockaddr.sin_port = htons(to.port); |
|
|
sockaddr.sin_port = htons(to.port); |
|
|
int ret = ::sendto(m_sock_fd, data, length, 0, (struct sockaddr*)&sockaddr, sizeof(sockaddr)); |
|
|
int ret = ::sendto(m_sock_fd, data, length, 0, (struct sockaddr*)&sockaddr, sizeof(sockaddr)); |
|
|
if (ret != length) return kxs_ec_send_fail; |
|
|
|
|
|
|
|
|
if (sendlength) *sendlength = ret; |
|
|
|
|
|
if (ret >= 0) { |
|
|
return kxs_ec_success; |
|
|
return kxs_ec_success; |
|
|
} |
|
|
} |
|
|
xs_error_code_t XSUDP::receive(const char* data, int32_t length, XsyncNetAdd& from, int overtimems) { |
|
|
|
|
|
struct sockaddr_in sockaddr; |
|
|
|
|
|
|
|
|
return kxs_ec_send_fail; |
|
|
|
|
|
} |
|
|
|
|
|
xs_error_code_t XSUDP::receive(char* data, int32_t& length, XsyncNetAdd& from, int overtimems) { |
|
|
|
|
|
struct sockaddr_in sockaddr = {0}; |
|
|
|
|
|
|
|
|
timeval timeout; |
|
|
timeval timeout; |
|
|
timeout.tv_sec = overtimems; |
|
|
timeout.tv_sec = overtimems; |
|
@ -51,12 +60,25 @@ xs_error_code_t XSUDP::receive(const char* data, int32_t length, XsyncNetAdd& fr |
|
|
return kxs_ec_setsockopt_rx_timeout_fail; |
|
|
return kxs_ec_setsockopt_rx_timeout_fail; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
sockaddr.sin_family = AF_INET; |
|
|
|
|
|
sockaddr.sin_addr.s_addr = htonl(from.ip); |
|
|
|
|
|
sockaddr.sin_port = htons(from.port); |
|
|
|
|
|
|
|
|
// sockaddr.sin_family = AF_INET;
|
|
|
|
|
|
// sockaddr.sin_addr.s_addr = inet_addr(from.ip.c_str());
|
|
|
|
|
|
// sockaddr.sin_port = htons(from.port);
|
|
|
int senderAddressLen = sizeof(sockaddr); |
|
|
int senderAddressLen = sizeof(sockaddr); |
|
|
int ret = ::recvfrom(m_sock_fd, (char*)data, length, 0, (struct sockaddr*)&sockaddr, &senderAddressLen); |
|
|
int ret = ::recvfrom(m_sock_fd, (char*)data, length, 0, (struct sockaddr*)&sockaddr, &senderAddressLen); |
|
|
if (ret != length) return kxs_ec_receive_fail; |
|
|
|
|
|
|
|
|
length = ret; |
|
|
|
|
|
if (ret < 0) { |
|
|
|
|
|
if (errno == EWOULDBLOCK || errno == EAGAIN) { |
|
|
|
|
|
return kxs_ec_overtime; |
|
|
|
|
|
} else { |
|
|
|
|
|
return kxs_ec_receive_fail; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// inet_ntop(AF_INET, &(sockaddr.sin_addr), ip, INET_ADDRSTRLEN);
|
|
|
|
|
|
uint32_t ip = ntohl(sockaddr.sin_addr.s_addr); |
|
|
|
|
|
from.ip = string(fmtip(ip)); |
|
|
|
|
|
from.port = ntohs(sockaddr.sin_port); |
|
|
|
|
|
|
|
|
return kxs_ec_success; |
|
|
return kxs_ec_success; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -64,13 +86,11 @@ xs_error_code_t XSUDP::receive(const char* data, int32_t length, XsyncNetAdd& fr |
|
|
* xSyncUdpFactoryImpl * |
|
|
* xSyncUdpFactoryImpl * |
|
|
*******************************************************************************/ |
|
|
*******************************************************************************/ |
|
|
|
|
|
|
|
|
void XSyncUdpFactoryImpl::initialize() { |
|
|
|
|
|
static bool isInit = false; |
|
|
|
|
|
if (!isInit) { |
|
|
|
|
|
WSADATA wsaData; |
|
|
|
|
|
WSAStartup(MAKEWORD(2, 2), &wsaData); |
|
|
|
|
|
isInit = true; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
void XSyncUdpFactoryImpl::initialize() {} |
|
|
|
|
|
|
|
|
|
|
|
XSyncUdpFactoryImpl* XSyncUdpFactoryImpl::Ins() { |
|
|
|
|
|
static XSyncUdpFactoryImpl instance; |
|
|
|
|
|
return &instance; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
shared_ptr<I_XSUDPListener> XSyncUdpFactoryImpl::createXSUDPListener() { return nullptr; } |
|
|
shared_ptr<I_XSUDPListener> XSyncUdpFactoryImpl::createXSUDPListener() { return nullptr; } |