185 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			185 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C
		
	
	
#include "sockets.h"
 | 
						|
#include <sys/types.h>
 | 
						|
#include <string.h>
 | 
						|
#include "../common.h"
 | 
						|
#include "../stubs.h"
 | 
						|
 | 
						|
#include <fcntl.h>
 | 
						|
 | 
						|
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");
 | 
						|
  }
 | 
						|
}
 |