timesynk/old/net/sockets.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");
}
}