// SwiftShader Software Renderer | |
// | |
// Copyright(c) 2005-2012 TransGaming Inc. | |
// | |
// All rights reserved. No part of this software may be copied, distributed, transmitted, | |
// transcribed, stored in a retrieval system, translated into any human or computer | |
// language by any means, or disclosed to third parties without the explicit written | |
// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express | |
// or implied, including but not limited to any patent rights, are granted to you. | |
// | |
#include "Socket.hpp" | |
#if defined(_WIN32) | |
#include <ws2tcpip.h> | |
#else | |
#include <unistd.h> | |
#include <netdb.h> | |
#include <netinet/in.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 = {0}; | |
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 | |
} | |
} |