12 #include "..\..\hal\socket.h"
19 #pragma comment (lib, "Ws2_32.lib")
21 namespace rp{
namespace net {
29 iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
38 static const char*
_inet_ntop(
int af,
const void* src,
char* dst,
int cnt){
40 struct sockaddr_storage srcaddr;
45 memset(&srcaddr, 0,
sizeof(
struct sockaddr_storage));
48 srcaddr.ss_family = af;
53 struct sockaddr_in * ipv4 =
reinterpret_cast< struct sockaddr_in *
>(&srcaddr);
54 memcpy(&(ipv4->sin_addr), src,
sizeof(ipv4->sin_addr));
59 struct sockaddr_in6 * ipv6 =
reinterpret_cast< struct sockaddr_in6 *
>(&srcaddr);
60 memcpy(&(ipv6->sin6_addr), src,
sizeof(ipv6->sin6_addr));
65 if (WSAAddressToStringA((
struct sockaddr*) &srcaddr,
sizeof(
struct sockaddr_storage), 0, dst, (LPDWORD) &cnt) != 0) {
66 DWORD rv = WSAGetLastError();
72 static int _inet_pton(
int Family,
const char * pszAddrString,
void* pAddrBuf)
74 struct sockaddr_storage tmpholder;
75 int actualSize =
sizeof(sockaddr_storage);
77 int result = WSAStringToAddressA((
char *)pszAddrString, Family, NULL, (sockaddr*)&tmpholder, &actualSize);
83 struct sockaddr_in * ipv4 =
reinterpret_cast< struct sockaddr_in *
>(&tmpholder);
84 memcpy(pAddrBuf, &(ipv4->sin_addr),
sizeof(ipv4->sin_addr));
89 struct sockaddr_in6 * ipv6 =
reinterpret_cast< struct sockaddr_in6 *
>(&tmpholder);
90 memcpy(pAddrBuf, &(ipv6->sin6_addr),
sizeof(ipv6->sin6_addr));
108 assert(!
"should not reach here");
120 reinterpret_cast<sockaddr_storage *
>(
_platform_data)->ss_family = AF_INET;
126 memcpy(
_platform_data, src._platform_data,
sizeof(sockaddr_storage));
138 reinterpret_cast<sockaddr_storage *
>(
_platform_data)->ss_family = AF_INET;
145 : _platform_data(platform_data)
148 SocketAddress & SocketAddress::operator = (
const SocketAddress &src)
150 memcpy(_platform_data, src._platform_data,
sizeof(sockaddr_storage));
155 SocketAddress::~SocketAddress()
157 delete reinterpret_cast<sockaddr_storage *
>(_platform_data);
160 SocketAddress::address_type_t SocketAddress::getAddressType()
const
162 switch(
reinterpret_cast<const sockaddr_storage *
>(_platform_data)->ss_family) {
164 return ADDRESS_TYPE_INET;
166 return ADDRESS_TYPE_INET6;
168 assert(!
"should not reach here");
169 return ADDRESS_TYPE_INET;
173 int SocketAddress::getPort()
const
175 switch (getAddressType()) {
176 case ADDRESS_TYPE_INET:
177 return (
int)ntohs(
reinterpret_cast<const sockaddr_in *
>(_platform_data)->sin_port);
178 case ADDRESS_TYPE_INET6:
179 return (
int)ntohs(
reinterpret_cast<const sockaddr_in6 *
>(_platform_data)->sin6_port);
185 u_result SocketAddress::setPort(
int port)
187 switch (getAddressType()) {
188 case ADDRESS_TYPE_INET:
189 reinterpret_cast<sockaddr_in *
>(_platform_data)->sin_port = htons((
short)port);
191 case ADDRESS_TYPE_INET6:
192 reinterpret_cast<sockaddr_in6 *
>(_platform_data)->sin6_port = htons((
short)port);
200 u_result SocketAddress::setAddressFromString(
const char * address_string, SocketAddress::address_type_t
type)
205 case ADDRESS_TYPE_INET:
206 reinterpret_cast<sockaddr_storage *
>(_platform_data)->ss_family = AF_INET;
209 &
reinterpret_cast<sockaddr_in *
>(_platform_data)->sin_addr);
213 case ADDRESS_TYPE_INET6:
215 reinterpret_cast<sockaddr_storage *
>(_platform_data)->ss_family = AF_INET6;
218 &
reinterpret_cast<sockaddr_in6 *
>(_platform_data)->sin6_addr);
231 u_result SocketAddress::getAddressAsString(
char * buffer,
size_t buffersize)
const
233 int net_family =
reinterpret_cast<const sockaddr_storage *
>(_platform_data)->ss_family;
234 const char *ans = NULL;
235 switch (net_family) {
237 ans =
_inet_ntop(net_family, &
reinterpret_cast<const sockaddr_in *
>(_platform_data)->sin_addr,
238 buffer, (
int)buffersize);
242 ans =
_inet_ntop(net_family, &
reinterpret_cast<const sockaddr_in6 *
>(_platform_data)->sin6_addr,
243 buffer, (
int)buffersize);
252 size_t SocketAddress::LoopUpHostName(
const char * hostname,
const char * sevicename, std::vector<SocketAddress> &addresspool ,
bool performDNS, SocketAddress::address_type_t
type)
254 struct addrinfo hints;
258 memset(&hints, 0,
sizeof(
struct addrinfo));
260 hints.ai_flags = AI_PASSIVE;
263 hints.ai_family |= AI_NUMERICSERV | AI_NUMERICHOST;
267 ans = getaddrinfo(hostname, sevicename, &hints, &
result);
277 for (
struct addrinfo * cursor =
result; cursor != NULL; cursor = cursor->ai_next) {
278 if (cursor->ai_family == ADDRESS_TYPE_INET || cursor->ai_family == ADDRESS_TYPE_INET6) {
279 sockaddr_storage * storagebuffer =
new sockaddr_storage;
280 assert(
sizeof(sockaddr_storage) >= cursor->ai_addrlen);
281 memcpy(storagebuffer, cursor->ai_addr, cursor->ai_addrlen);
282 addresspool.push_back(SocketAddress(storagebuffer));
289 return addresspool.size();
293 u_result SocketAddress::getRawAddress(
_u8 * buffer,
size_t bufferSize)
const
295 switch (getAddressType()) {
296 case ADDRESS_TYPE_INET:
297 if (bufferSize <
sizeof(
reinterpret_cast<const sockaddr_in *
>(_platform_data)->sin_addr.s_addr))
return RESULT_INSUFFICIENT_MEMORY;
299 memcpy(buffer, &
reinterpret_cast<const sockaddr_in *
>(_platform_data)->sin_addr.s_addr,
sizeof(
reinterpret_cast<const sockaddr_in *
>(_platform_data)->sin_addr.s_addr));
303 case ADDRESS_TYPE_INET6:
304 if (bufferSize <
sizeof(
reinterpret_cast<const sockaddr_in6 *
>(_platform_data)->sin6_addr.s6_addr))
return RESULT_INSUFFICIENT_MEMORY;
305 memcpy(buffer,
reinterpret_cast<const sockaddr_in6 *
>(_platform_data)->sin6_addr.s6_addr,
sizeof(
reinterpret_cast<const sockaddr_in6 *
>(_platform_data)->sin6_addr.s6_addr));
315 void SocketAddress::setLoopbackAddress(SocketAddress::address_type_t
type)
320 case ADDRESS_TYPE_INET:
322 sockaddr_in * addrv4 =
reinterpret_cast<sockaddr_in *
>(_platform_data);
323 addrv4->sin_family = AF_INET;
324 addrv4->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
327 case ADDRESS_TYPE_INET6:
329 sockaddr_in6 * addrv6 =
reinterpret_cast<sockaddr_in6 *
>(_platform_data);
330 addrv6->sin6_family = AF_INET6;
331 addrv6->sin6_addr = in6addr_loopback;
342 void SocketAddress::setBroadcastAddressIPv4()
346 sockaddr_in * addrv4 =
reinterpret_cast<sockaddr_in *
>(_platform_data);
347 addrv4->sin_family = AF_INET;
348 addrv4->sin_addr.s_addr = htonl(INADDR_BROADCAST);
353 void SocketAddress::setAnyAddress(SocketAddress::address_type_t
type)
357 case ADDRESS_TYPE_INET:
359 sockaddr_in * addrv4 =
reinterpret_cast<sockaddr_in *
>(_platform_data);
360 addrv4->sin_family = AF_INET;
361 addrv4->sin_addr.s_addr = htonl(INADDR_ANY);
364 case ADDRESS_TYPE_INET6:
366 sockaddr_in6 * addrv6 =
reinterpret_cast<sockaddr_in6 *
>(_platform_data);
367 addrv6->sin6_family = AF_INET6;
368 addrv6->sin6_addr = in6addr_any;
389 namespace rp {
namespace arch {
namespace net{
402 ::setsockopt( _socket_fd, SOL_SOCKET, SO_REUSEADDR , (
char *)&bool_true, (
int)
sizeof(bool_true) );
405 this->setTimeout(DEFAULT_SOCKET_TIMEOUT, SOCKET_DIR_BOTH);
410 closesocket(_socket_fd);
421 const struct sockaddr * addr =
reinterpret_cast<const struct sockaddr *
>(localaddr.
getPlatformData());
423 int ans = ::bind(_socket_fd, addr, (
int)
sizeof(sockaddr_storage));
433 struct sockaddr * addr =
reinterpret_cast<struct sockaddr *
>(
const_cast<void *
>(localaddr.
getPlatformData()));
436 int actualsize =
sizeof(sockaddr_storage);
437 int ans = ::getsockname(_socket_fd, addr, &actualsize);
439 assert(actualsize <=
sizeof(sockaddr_storage));
440 assert(addr->sa_family == AF_INET || addr->sa_family == AF_INET6);
449 tv.tv_sec = timeout / 1000;
450 tv.tv_usec = (timeout % 1000) * 1000;
452 if (msk & SOCKET_DIR_RD) {
453 ans = ::setsockopt( _socket_fd, SOL_SOCKET, SO_RCVTIMEO, (
char *)&tv, (
int)
sizeof(tv) );
457 if (msk & SOCKET_DIR_WR) {
458 ans = ::setsockopt( _socket_fd, SOL_SOCKET, SO_SNDTIMEO, (
char *)&tv, (
int)
sizeof(tv) );
467 u_long mode_block = 0;
468 u_long mode_notBlock = 1;
471 if (SOCKET_ERROR == ioctlsocket(_socket_fd, (
long)FIONBIO, &mode_notBlock))
481 const struct sockaddr * addr =
reinterpret_cast<const struct sockaddr *
>(pairAddress.
getPlatformData());
482 int ans = ::connect(_socket_fd, addr, (
int)
sizeof(sockaddr_storage));
487 FD_SET(_socket_fd, &
set);
489 if (select(-1, NULL, &
set, NULL, &tm) <= 0)
496 int optLen =
sizeof(int);
497 getsockopt(_socket_fd, SOL_SOCKET, SO_ERROR, (
char*)&error, &optLen);
509 if (SOCKET_ERROR == ioctlsocket(_socket_fd, (
long)FIONBIO, &mode_block))
525 int ans = ::listen( _socket_fd, backlog);
533 addrsize =
sizeof(sockaddr_storage);
534 SOCKET pair_socket = ::accept( _socket_fd, pairAddress?
reinterpret_cast<struct sockaddr *
>(
const_cast<void *
>(pairAddress->
getPlatformData())):NULL
537 if (pair_socket>=0) {
546 return waitforData(timeout);
551 int ans = ::send( _socket_fd, (
const char *)buffer, (
int)len, 0);
552 if (ans != SOCKET_ERROR ) {
553 assert(ans == (
int)len);
557 switch(WSAGetLastError()) {
570 int ans = ::recv( _socket_fd, (
char *)buf, (
int)len, 0);
573 if (ans == SOCKET_ERROR) {
575 switch(WSAGetLastError()) {
589 struct sockaddr * addr =
reinterpret_cast<struct sockaddr *
>(
const_cast<void *
>(peerAddr.
getPlatformData()));
591 int actualsize = (int)
sizeof(sockaddr_storage);
592 int ans = ::getpeername(_socket_fd, addr, &actualsize);
594 assert(actualsize <= (
int)
sizeof(sockaddr_storage));
595 assert(addr->sa_family == AF_INET || addr->sa_family == AF_INET6);
607 shutdw_opt = SD_RECEIVE;
610 shutdw_opt = SD_SEND;
612 case SOCKET_DIR_BOTH:
614 shutdw_opt = SD_BOTH;
617 int ans = ::shutdown(_socket_fd, shutdw_opt);
623 int bool_true = enable?1:0;
629 int bool_true = enable?1:0;
637 FD_SET(_socket_fd, &wrset);
640 tv.tv_sec = timeout / 1000;
641 tv.tv_usec = (timeout % 1000) * 1000;
642 int ans = ::select(NULL, NULL, &wrset, NULL, &tv);
661 FD_SET(_socket_fd, &rdset);
664 tv.tv_sec = timeout / 1000;
665 tv.tv_usec = (timeout % 1000) * 1000;
666 int ans = ::select((
int)_socket_fd+1, &rdset, NULL, NULL, &tv);
698 ::setsockopt( _socket_fd, SOL_SOCKET, SO_REUSEADDR | SO_BROADCAST , (
char *)&bool_true, (
int)
sizeof(bool_true) );
699 setTimeout(DEFAULT_SOCKET_TIMEOUT, SOCKET_DIR_BOTH);
704 closesocket(_socket_fd);
715 const struct sockaddr * addr =
reinterpret_cast<const struct sockaddr *
>(localaddr.
getPlatformData());
717 int ans = ::bind(_socket_fd, addr, (
int)
sizeof(sockaddr_storage));
727 struct sockaddr * addr =
reinterpret_cast<struct sockaddr *
>(
const_cast<void *
>((localaddr.
getPlatformData())));
730 int actualsize = (int)
sizeof(sockaddr_storage);
731 int ans = ::getsockname(_socket_fd, addr, &actualsize);
733 assert(actualsize <= (
int)
sizeof(sockaddr_storage));
734 assert(addr->sa_family == AF_INET || addr->sa_family == AF_INET6);
743 tv.tv_sec = timeout / 1000;
744 tv.tv_usec = (timeout % 1000) * 1000;
746 if (msk & SOCKET_DIR_RD) {
747 ans = ::setsockopt( _socket_fd, SOL_SOCKET, SO_RCVTIMEO, (
const char *)&tv, (
int)
sizeof(tv) );
751 if (msk & SOCKET_DIR_WR) {
752 ans = ::setsockopt( _socket_fd, SOL_SOCKET, SO_SNDTIMEO, (
const char *)&tv, (
int)
sizeof(tv) );
764 FD_SET(_socket_fd, &wrset);
767 tv.tv_sec = timeout / 1000;
768 tv.tv_usec = (timeout % 1000) * 1000;
769 int ans = ::select(NULL, NULL, &wrset, NULL, &tv);
788 FD_SET(_socket_fd, &rdset);
791 tv.tv_sec = timeout / 1000;
792 tv.tv_usec = (timeout % 1000) * 1000;
793 int ans = ::select(NULL, &rdset, NULL, NULL, &tv);
810 sockaddr_storage unspecAddr;
811 unspecAddr.ss_family = AF_UNSPEC;
813 const struct sockaddr * addr = pairAddress ?
reinterpret_cast<const struct sockaddr *
>(pairAddress->
getPlatformData()) :
reinterpret_cast<const struct sockaddr *
>(&unspecAddr);
814 int ans = ::connect(_socket_fd, addr, (
int)
sizeof(sockaddr_storage));
822 const struct sockaddr * addr = target?
reinterpret_cast<const struct sockaddr *
>(target->
getPlatformData()): NULL;
823 int dest_addr_size = (target ?
sizeof(sockaddr_storage) : 0);
824 int ans = ::sendto( _socket_fd, (
const char *)buffer, (
int)len, 0, addr, dest_addr_size);
825 if (ans != SOCKET_ERROR) {
826 assert(ans == (
int)len);
829 switch(WSAGetLastError()) {
848 FD_SET(_socket_fd, &rdset);
852 memset(recv_data, 0,
sizeof(recv_data));
854 res = select(FD_SETSIZE, &rdset,
nullptr,
nullptr, &tv);
856 recv(_socket_fd, recv_data, 1, 0);
864 struct sockaddr * addr = (sourceAddr?
reinterpret_cast<struct sockaddr *
>(
const_cast<void *
>(sourceAddr->
getPlatformData())):NULL);
865 int source_addr_size = (sourceAddr?
sizeof(sockaddr_storage):0);
867 int ans = ::recvfrom( _socket_fd, (
char *)buf, (
int)len, 0, addr, addr?&source_addr_size:NULL);
868 if (ans == SOCKET_ERROR) {
870 int errCode = WSAGetLastError();
895 namespace rp {
namespace net{
909 assert(!
"should not reach here");
922 SOCKET socket_fd = ::socket(socket_family, SOCK_STREAM, 0);
923 if (socket_fd == -1)
return NULL;
936 SOCKET socket_fd = ::socket(socket_family, (family ==
SOCKET_FAMILY_RAW) ? SOCK_RAW : SOCK_DGRAM, 0);
937 if (socket_fd == -1)
return NULL;