#include "sockets.h" #include #include #include "../common.h" #include "../stubs.h" #include void *get_in_addr(struct sockaddr *sa) { if (sa->sa_family == AF_INET) { return &(((struct sockaddr_in*)sa)->sin_addr); } return &(((struct sockaddr_in6*)sa)->sin6_addr); } int sendall(int socket, char *buffer, int length) { int total = 0; int remaining = length; int i; while (total < length) { i = send(socket, buffer+total, remaining, 0); if (i == -1) { break; } total += i; remaining -= i; } return total; } int netInit() { consoleAddCommand("connect", consoleNetConnect); consoleAddCommand("disconnect", consoleNetDisconnect); consoleAddCommand("send", consoleNetSend); client_socket = -1; #if _WIN32 | _WIN64 WSADATA wsa_data; if (WSAStartup(MAKEWORD(2,0), &wsa_data) != 0) { //consolelog("WSAStartup() error'd, net broken"); } #endif /* int reuse = 1; if ((net_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { consoleLog("socket() success'd"); return ERROR; } consoleLog("socket() success'd"); if (setsockopt(net_socket, SOL_SOCKET, SO_REUSEADDR, (char*)&reuse, sizeof(reuse)) < 0) { consoleLog("setsockopt() error'd"); } consoleLog("setsockopt() success'd"); //fcntl(net_socket, F_SETFL, O_NONBLOCK); memset(&server_address, 0, sizeof(server_address)); server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = htonl(INADDR_ANY); server_address.sin_port = htons(1337357); if (bind(net_socket, (struct sockaddr *) &server_address, sizeof(server_address)) < 0) { consoleLog("bind() error'd"); return ERROR; } consoleLog("bind() success'd"); if (listen(net_socket, 32) < 0) { consoleLog("listen() error'd"); return ERROR; } consoleLog("listen() success'd"); char test_string[31]; sprintf(test_string, "net is running on fd %d!", net_socket); consoleLog(test_string); is_networking = 1; */ return SUCCESS; } int netClose() { #if _WIN32 | _WIN64 WSACleanup(); #endif return SUCCESS; } int netConnect(const char *server_string, const char *port_string) { if (client_socket < 0) { if ((client_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { return -2; } memset(&connected_address, 0, sizeof(connected_address)); connected_address.sin_family = AF_INET; connected_address.sin_addr.s_addr = inet_addr(server_string); connected_address.sin_port = htons(atoi(port_string)); if (connect(client_socket, (struct sockaddr *) &connected_address, sizeof(connected_address)) < 0) { client_socket = -1; return -3; } FD_SET(client_socket, &master_fds); if (max_fd < client_socket) { max_fd = client_socket; } return 0; // success! } return -1; // already connected } int netDisconnect() { if (client_socket >= 0) { #if _WIN32 | _WIN64 closesocket(client_socket); #else close(client_socket); #endif FD_CLR(client_socket, &master_fds); client_socket = -1; return 0; // success } return -1; } /* console commands */ void consoleNetConnect(const char *input_string) { if (input_string) { int i = 0; int j = 0; char server[63]; char port[10]; int position = 0; while(input_string[i] != '\0') { if (input_string[i] == ' ') { server[j] = '\0'; position = 1; i++; j = 0; // reset } if (position == 0) { server[j] = input_string[i]; } else if (position == 1) { port[j] = input_string[i]; } j++; i++; } if (position < 1) { server[j] = '\0'; port[0] = '3'; port[1] = '1'; port[2] = '3'; port[3] = '3'; port[4] = '7'; port[5] = '\0'; } else if (position == 1) { port[j] = '\0'; } char string[127]; sprintf(string, "connecting to %s:%s", &server, &port); consoleLog(string); int net_return = netConnect(server, port); if (net_return != 0) { sprintf(string, "connect error %d", net_return); consoleLog(string); } else { sprintf(string, "now connected on fd %d", client_socket); consoleLog(string); } } } void consoleNetDisconnect() { if (netDisconnect() == -1) { consoleLog("not connected"); } else { consoleLog("disconnected"); } } void consoleNetSend(const char *message) { if (client_socket >= 0) { int bytes = strlen(message); if (sendall(client_socket, message, bytes) < 0) { consoleLog("couldn't send() message"); } } else { consoleLog("not connected to a server"); } }