Files
LayaNative2.0/Conch/source/conch/JSWrapper/v8debug/V8Win32Socket.cpp
T
2020-11-11 16:17:13 +08:00

170 lines
3.4 KiB
C++

// ----------------------------------------------------------------------------
// Win32 socket support.
//
#include "V8Socket.h"
#include <memory>
#ifdef _WIN32
#else
#include <unistd.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#endif
//using namespace v8;
namespace laya {
bool Win32Socket::Bind(const int port) {
if (!IsValid()) {
return false;
}
sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(port);
int status = bind(socket_,
reinterpret_cast<struct sockaddr *>(&addr),
sizeof(addr));
return status == 0;
}
bool Win32Socket::Listen(int backlog) const {
if (!IsValid()) {
return false;
}
int status = listen(socket_, backlog);
return status == 0;
}
V8Socket* Win32Socket::Accept() const {
if (!IsValid()) {
return NULL;
}
SOCKET socket = accept(socket_, NULL, NULL);
if (socket == __INVALID_SOCKET) {
return NULL;
}
else {
return new Win32Socket(socket);
}
}
bool Win32Socket::Connect(const char* host, const char* port) {
return false;
/*
if (!IsValid()) {
return false;
}
// Lookup host and port.
struct addrinfo *result = NULL;
struct addrinfo hints;
memset(&hints, 0, sizeof(addrinfo));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
int status = getaddrinfo(host, port, &hints, &result);
if (status != 0) {
return false;
}
// Connect.
status = connect(socket_,
result->ai_addr,
static_cast<int>(result->ai_addrlen));
freeaddrinfo(result);
return status == 0;
*/
}
bool Win32Socket::Shutdown() {
if (IsValid()) {
// Shutdown socket for both read and write.
int status = shutdown(socket_, 2);// SD_BOTH);
#ifdef _WIN32
closesocket(socket_);
#else
close(socket_);
#endif
socket_ = __INVALID_SOCKET;
return status == -1;
}
return true;
}
int Win32Socket::Send(const char* data, int len) const {
if (len <= 0) return 0;
int written = 0;
while (written < len) {
int status = send(socket_, data + written, len - written, 0);
if (status == 0) {
break;
}
else if (status > 0) {
written += status;
}
else {
return 0;
}
}
return written;
}
int Win32Socket::Receive(char* data, int len) const {
if (len <= 0) return 0;
int status = recv(socket_, data, len, 0);
return (status == -1) ? 0 : status;
}
bool Win32Socket::SetReuseAddress(bool reuse_address) {
bool on = reuse_address ? true : false;
int status = setsockopt(socket_, SOL_SOCKET, SO_REUSEADDR,
reinterpret_cast<char*>(&on), sizeof(on));
return status == -1;
}
bool V8Socket::SetUp() {
// Initialize Winsock32
#ifdef _WIN32
int err;
WSADATA winsock_data;
WORD version_requested = MAKEWORD(1, 0);
err = WSAStartup(version_requested, &winsock_data);
if (err != 0) {
//v8::internal::PrintF("Unable to initialize Winsock, err = %d\n", Socket::LastError());
}
return err == 0;
#endif
return true;
}
int V8Socket::LastError() {
#ifdef _WIN32
return WSAGetLastError();
#endif
return 0;
}
uint16_t V8Socket::HToN(uint16_t value) {
return htons(value);
}
uint16_t V8Socket::NToH(uint16_t value) {
return ntohs(value);
}
uint32_t V8Socket::HToN(uint32_t value) {
return htonl(value);
}
uint32_t V8Socket::NToH(uint32_t value) {
return ntohl(value);
}
}