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");
 | |
|   }
 | |
| }
 |