| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- #include "Assert.h"
- #include <winsock2.h>
- #pragma comment(lib, "wsock32.lib")
- #include "Types.h"
- #include "OS.h"
- namespace crown
- {
- namespace os
- {
-
- TCPSocket::TCPSocket()
- {
- WSADATA WsaData;
- CE_ASSERT(WSAStartup(MAKEWORD(2,2), &WsaData) == NO_ERROR, "Unable to initialize socket");
- set_socket_id(0);
- set_active_socket_id(0);
- }
- TCPSocket::~TCPSocket()
- {
- WSACleanup();
- close();
- }
- bool TCPSocket::open(unsigned int32_t16_t port)
- {
- int32_t sd = socket(AF_INET, SOCK_STREAM, 0);
- if (sd <= 0)
- {
- os::print32_tf("failed to open socket\n");
- set_socket_id(0);
- return false;
- }
- set_socket_id(sd);
- // Bind socket
- sockaddr_in address;
- address.sin_family = AF_INET;
- address.sin_addr.s_addr = htonl(INADDR_ANY);
- address.sin_port = htons(port);
- if (bind(sd, (const sockaddr*)&address, sizeof(sockaddr_in)) < 0)
- {
- os::print32_tf("failed to bind socket\n");
- close();
- return false;
- }
- listen(sd, 5);
- os::print32_tf("listening on port %d", port);
- sockaddr_in client;
- uint32_t client_length = sizeof(client);
- int32_t active_sd = accept(sd, (sockaddr*)&client, &client_length);
- if (active_sd < 0)
- {
- os::print32_tf("failed to accept connections");
- }
- set_active_socket_id(active_sd);
- return true;
- }
- bool TCPSocket::connect(IPv4Address& destination)
- {
- int32_t sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (sd <= 0)
- {
- os::print32_tf("failed to open socket\n");
- set_socket_id(0);
- return false;
- }
-
- set_socket_id(sd);
- sockaddr_in address;
- address.sin_family = AF_INET;
- address.sin_addr.s_addr = htonl(destination.get_address());
- address.sin_port = htons(destination.get_port());
- if (::connect(sd, (const sockaddr*)&address, sizeof(sockaddr_in)) < 0)
- {
- os::print32_tf("failed to connect socket\n");
- close();
- return false;
- }
- }
- int32_t TCPSocket::close()
- {
- int32_t asd = get_active_socket_id();
- if (asd != 0)
- {
- closesocket(asd);
- set_active_socket_id(0);
- }
- int32_t sd = get_socket_id();
- if (sd != 0)
- {
- closesocket(sd);
- set_socket_id(0);
- }
- }
- bool TCPSocket::send(const void* data, int32_t size)
- {
- CE_ASSERT(data);
- CE_ASSERT(size > 0);
- int32_t sd = get_active_socket_id();
- if (sd <= 0)
- {
- set_socket_id(0);
- set_active_socket_id(0);
- return false;
- }
- int32_t sent_bytes = ::send(sd, (const char*)data, size, 0);
- if (sent_bytes <= 0)
- {
- os::print32_tf("Unable to send data");
- return false;
- }
- return true;
- }
- int32_t TCPSocket::receive(void* data, int32_t size)
- {
- CE_ASSERT(data);
- CE_ASSERT(size > 0);
- int32_t sd = get_active_socket_id();
- if ( sd <= 0 )
- {
- return false;
- }
- int32_t received_bytes = recv(sd, (char*)data, size, 0);
- if ( received_bytes <= 0 )
- {
- return 0;
- }
- return received_bytes;
- }
- bool TCPSocket::is_open()
- {
- return m_active_socket != 0 || m_socket != 0;
- }
- int32_t TCPSocket::get_socket_id()
- {
- return m_socket;
- }
- int32_t TCPSocket::get_active_socket_id()
- {
- return m_active_socket != 0 ? m_active_socket : m_socket;
- }
- void TCPSocket::set_socket_id(int32_t socket)
- {
- m_socket = socket;
- }
- void TCPSocket::set_active_socket_id(int32_t socket)
- {
- m_active_socket = socket;
- }
-
- }
- }
|