wip
This commit is contained in:
parent
cde6519059
commit
0e2ca4f931
6 changed files with 55 additions and 11 deletions
|
|
@ -25,7 +25,7 @@ GSDECL void GSNetServerClose(GSNetServer net);
|
||||||
/* net_base.c */
|
/* net_base.c */
|
||||||
GSDECL GSBool GSNetBaseHasData(int fd);
|
GSDECL GSBool GSNetBaseHasData(int fd);
|
||||||
GSDECL int GSNetBaseServer(int port);
|
GSDECL int GSNetBaseServer(int port);
|
||||||
GSDECL int GSNetBaseClient(const char* hostname, int port);
|
GSDECL int GSNetBaseClient(const char* hostname, int port, GSNetAddress* address);
|
||||||
GSDECL void GSNetBaseClose(int fd);
|
GSDECL void GSNetBaseClose(int fd);
|
||||||
GSDECL int GSNetBaseRead(int fd, void* data, int size, GSNetAddress* address); /* always read 508 bytes! */
|
GSDECL int GSNetBaseRead(int fd, void* data, int size, GSNetAddress* address); /* always read 508 bytes! */
|
||||||
GSDECL void GSNetBaseWrite(int fd, void* data, int size, GSNetAddress* address);
|
GSDECL void GSNetBaseWrite(int fd, void* data, int size, GSNetAddress* address);
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,7 @@ typedef struct _GSNetPacket GSNetPacket;
|
||||||
typedef struct _GSNetAddress GSNetAddress;
|
typedef struct _GSNetAddress GSNetAddress;
|
||||||
typedef struct _GSBinary GSBinary;
|
typedef struct _GSBinary GSBinary;
|
||||||
typedef struct _GSNetState GSNetState;
|
typedef struct _GSNetState GSNetState;
|
||||||
|
typedef struct _GSNetKV GSNetKV;
|
||||||
#ifdef _GEARSRC
|
#ifdef _GEARSRC
|
||||||
typedef struct _GSClient* GSClient;
|
typedef struct _GSClient* GSClient;
|
||||||
typedef struct _GSServer* GSServer;
|
typedef struct _GSServer* GSServer;
|
||||||
|
|
@ -154,6 +155,13 @@ struct _GSNetState {
|
||||||
|
|
||||||
GSBinary* rx;
|
GSBinary* rx;
|
||||||
GSBinary* tx;
|
GSBinary* tx;
|
||||||
|
|
||||||
|
void* opaque;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _GSNetKV {
|
||||||
|
GSNetAddress key;
|
||||||
|
GSNetState value;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef _GEARSRC
|
#ifdef _GEARSRC
|
||||||
|
|
@ -273,6 +281,7 @@ struct _GSNetClient {
|
||||||
|
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
|
GSNetAddress address;
|
||||||
GSNetState state;
|
GSNetState state;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -280,6 +289,8 @@ struct _GSNetServer {
|
||||||
GSEngine engine;
|
GSEngine engine;
|
||||||
|
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
|
GSNetKV* client;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GSClient {
|
struct _GSClient {
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,7 @@ int GSNetBaseServer(int port) {
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
int GSNetBaseClient(const char* hostname, int port) {
|
int GSNetBaseClient(const char* hostname, int port, GSNetAddress* address) {
|
||||||
struct sockaddr_in addr;
|
struct sockaddr_in addr;
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
|
|
@ -78,6 +78,11 @@ int GSNetBaseClient(const char* hostname, int port) {
|
||||||
addr.sin_addr.s_addr = *(GSU32*)host->h_addr_list[0];
|
addr.sin_addr.s_addr = *(GSU32*)host->h_addr_list[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(address != NULL){
|
||||||
|
address->address = addr.sin_addr.s_addr;
|
||||||
|
address->port = addr.sin_port;
|
||||||
|
}
|
||||||
|
|
||||||
if((fd = new_socket()) < 0) return -1;
|
if((fd = new_socket()) < 0) return -1;
|
||||||
|
|
||||||
connect(fd, (struct sockaddr*)&addr, sizeof(addr));
|
connect(fd, (struct sockaddr*)&addr, sizeof(addr));
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ GSNetClient GSNetClientOpen(GSClient client, const char* hostname, int port) {
|
||||||
|
|
||||||
net->engine = client->engine;
|
net->engine = client->engine;
|
||||||
|
|
||||||
if((net->fd = GSNetBaseClient(hostname, port)) < 0) {
|
if((net->fd = GSNetBaseClient(hostname, port, &net->address)) < 0) {
|
||||||
GSLog(client->engine, GSLogError, "Failed to initialize socket");
|
GSLog(client->engine, GSLogError, "Failed to initialize socket");
|
||||||
GSNetClientClose(net);
|
GSNetClientClose(net);
|
||||||
|
|
||||||
|
|
@ -31,14 +31,13 @@ GSNetClient GSNetClientOpen(GSClient client, const char* hostname, int port) {
|
||||||
|
|
||||||
void GSNetClientStep(GSNetClient net) {
|
void GSNetClientStep(GSNetClient net) {
|
||||||
GSNetPacket pkt;
|
GSNetPacket pkt;
|
||||||
GSNetAddress addr;
|
|
||||||
|
|
||||||
while(GSNetBaseHasData(net->fd)){
|
while(GSNetBaseHasData(net->fd)){
|
||||||
GSNetPacketRead(net->fd, &pkt, &addr);
|
GSNetPacketRead(net->fd, &pkt, &net->address);
|
||||||
GSNetStateRead(&net->state, net->fd, &pkt, &addr);
|
GSNetStateRead(&net->state, net->fd, &pkt, &net->address);
|
||||||
}
|
}
|
||||||
|
|
||||||
GSNetStateWrite(&net->state, net->fd, &addr);
|
GSNetStateWrite(&net->state, net->fd, &net->address);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSNetClientClose(GSNetClient net) {
|
void GSNetClientClose(GSNetClient net) {
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
#include <GearSrc/Log.h>
|
#include <GearSrc/Log.h>
|
||||||
|
|
||||||
|
#include <stb_ds.h>
|
||||||
|
|
||||||
GSNetServer GSNetServerOpen(GSServer server, int port) {
|
GSNetServer GSNetServerOpen(GSServer server, int port) {
|
||||||
GSNetServer net = malloc(sizeof(*net));
|
GSNetServer net = malloc(sizeof(*net));
|
||||||
|
|
||||||
|
|
@ -20,6 +22,28 @@ GSNetServer GSNetServerOpen(GSServer server, int port) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSNetServerStep(GSNetServer net) {
|
void GSNetServerStep(GSNetServer net) {
|
||||||
|
int i;
|
||||||
|
GSNetPacket pkt;
|
||||||
|
GSNetAddress addr;
|
||||||
|
|
||||||
|
while(GSNetBaseHasData(net->fd)){
|
||||||
|
GSNetState v;
|
||||||
|
|
||||||
|
memset(&v, 0, sizeof(v));
|
||||||
|
v.engine = net->engine;
|
||||||
|
|
||||||
|
GSNetPacketRead(net->fd, &pkt, &addr);
|
||||||
|
|
||||||
|
i = hmgeti(net->client, addr);
|
||||||
|
if(i != -1) v = net->client[i].value;
|
||||||
|
|
||||||
|
GSNetStateRead(&v, net->fd, &pkt, &addr);
|
||||||
|
hmput(net->client, addr, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < hmlen(net->client); i++){
|
||||||
|
GSNetStateWrite(&net->client[i].value, net->fd, &net->client[i].key);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSNetServerClose(GSNetServer net) {
|
void GSNetServerClose(GSNetServer net) {
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,6 @@ void GSNetStateRead(GSNetState* state, int fd, GSNetPacket* packet, GSNetAddress
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSNetStateWrite(GSNetState* state, int fd, GSNetAddress* address){
|
void GSNetStateWrite(GSNetState* state, int fd, GSNetAddress* address){
|
||||||
|
|
||||||
if(arrlen(state->tx) > 0){
|
if(arrlen(state->tx) > 0){
|
||||||
if(state->txstate == Acknowledged){
|
if(state->txstate == Acknowledged){
|
||||||
int n = state->tx[0].size;
|
int n = state->tx[0].size;
|
||||||
|
|
@ -69,12 +68,18 @@ void GSNetStateWrite(GSNetState* state, int fd, GSNetAddress* address){
|
||||||
|
|
||||||
t = GSEndianSwapU32BE(state->txtotal);
|
t = GSEndianSwapU32BE(state->txtotal);
|
||||||
|
|
||||||
pkt.header.flag = 0;
|
|
||||||
pkt.header.index = state->txindex;
|
|
||||||
pkt.header.seq = state->txseq;
|
|
||||||
memcpy(pkt.data, &t, 4);
|
memcpy(pkt.data, &t, 4);
|
||||||
pkt.size = 4;
|
pkt.size = 4;
|
||||||
|
}else{
|
||||||
|
int m = 508 - sizeof(pkt.header);
|
||||||
|
int n = m * (state->txseq - 1);
|
||||||
|
|
||||||
|
pkt.size = (n > m) ? m : n;
|
||||||
|
memcpy(pkt.data, ((unsigned char*)state->tx[0].data) + n, pkt.size);
|
||||||
}
|
}
|
||||||
|
pkt.header.flag = 0;
|
||||||
|
pkt.header.index = state->txindex;
|
||||||
|
pkt.header.seq = state->txseq;
|
||||||
|
|
||||||
GSNetPacketWrite(fd, &pkt, address);
|
GSNetPacketWrite(fd, &pkt, address);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue