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