// Copyright 2016 The SwiftShader Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "Socket.hpp" #if defined(_WIN32) #include <ws2tcpip.h> #else #include <unistd.h> #include <netdb.h> #include <netinet/in.h> #include <sys/select.h> #endif namespace sw { Socket::Socket(SOCKET socket) : socket(socket) { } Socket::Socket(const char *address, const char *port) { #if defined(_WIN32) socket = INVALID_SOCKET; #else socket = -1; #endif addrinfo hints = {}; hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; hints.ai_flags = AI_PASSIVE; addrinfo *info = 0; getaddrinfo(address, port, &hints, &info); if(info) { socket = ::socket(info->ai_family, info->ai_socktype, info->ai_protocol); bind(socket, info->ai_addr, (int)info->ai_addrlen); } } Socket::~Socket() { #if defined(_WIN32) closesocket(socket); #else close(socket); #endif } void Socket::listen(int backlog) { ::listen(socket, backlog); } bool Socket::select(int us) { fd_set sockets; FD_ZERO(&sockets); FD_SET(socket, &sockets); timeval timeout = {us / 1000000, us % 1000000}; return ::select(FD_SETSIZE, &sockets, 0, 0, &timeout) >= 1; } Socket *Socket::accept() { return new Socket(::accept(socket, 0, 0)); } int Socket::receive(char *buffer, int length) { return recv(socket, buffer, length, 0); } void Socket::send(const char *buffer, int length) { ::send(socket, buffer, length, 0); } void Socket::startup() { #if defined(_WIN32) WSADATA winsockData; WSAStartup(MAKEWORD(2, 2), &winsockData); #endif } void Socket::cleanup() { #if defined(_WIN32) WSACleanup(); #endif } }