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 */
|
||||
GSDECL GSBool GSNetBaseHasData(int fd);
|
||||
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 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);
|
||||
|
|
|
|||
|
|
@ -50,6 +50,7 @@ typedef struct _GSNetPacket GSNetPacket;
|
|||
typedef struct _GSNetAddress GSNetAddress;
|
||||
typedef struct _GSBinary GSBinary;
|
||||
typedef struct _GSNetState GSNetState;
|
||||
typedef struct _GSNetKV GSNetKV;
|
||||
#ifdef _GEARSRC
|
||||
typedef struct _GSClient* GSClient;
|
||||
typedef struct _GSServer* GSServer;
|
||||
|
|
@ -154,6 +155,13 @@ struct _GSNetState {
|
|||
|
||||
GSBinary* rx;
|
||||
GSBinary* tx;
|
||||
|
||||
void* opaque;
|
||||
};
|
||||
|
||||
struct _GSNetKV {
|
||||
GSNetAddress key;
|
||||
GSNetState value;
|
||||
};
|
||||
|
||||
#ifdef _GEARSRC
|
||||
|
|
@ -273,6 +281,7 @@ struct _GSNetClient {
|
|||
|
||||
int fd;
|
||||
|
||||
GSNetAddress address;
|
||||
GSNetState state;
|
||||
};
|
||||
|
||||
|
|
@ -280,6 +289,8 @@ struct _GSNetServer {
|
|||
GSEngine engine;
|
||||
|
||||
int fd;
|
||||
|
||||
GSNetKV* client;
|
||||
};
|
||||
|
||||
struct _GSClient {
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ int GSNetBaseServer(int port) {
|
|||
return fd;
|
||||
}
|
||||
|
||||
int GSNetBaseClient(const char* hostname, int port) {
|
||||
int GSNetBaseClient(const char* hostname, int port, GSNetAddress* address) {
|
||||
struct sockaddr_in addr;
|
||||
int fd;
|
||||
|
||||
|
|
@ -78,6 +78,11 @@ int GSNetBaseClient(const char* hostname, int port) {
|
|||
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;
|
||||
|
||||
connect(fd, (struct sockaddr*)&addr, sizeof(addr));
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ GSNetClient GSNetClientOpen(GSClient client, const char* hostname, int port) {
|
|||
|
||||
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");
|
||||
GSNetClientClose(net);
|
||||
|
||||
|
|
@ -31,14 +31,13 @@ GSNetClient GSNetClientOpen(GSClient client, const char* hostname, int port) {
|
|||
|
||||
void GSNetClientStep(GSNetClient net) {
|
||||
GSNetPacket pkt;
|
||||
GSNetAddress addr;
|
||||
|
||||
while(GSNetBaseHasData(net->fd)){
|
||||
GSNetPacketRead(net->fd, &pkt, &addr);
|
||||
GSNetStateRead(&net->state, net->fd, &pkt, &addr);
|
||||
GSNetPacketRead(net->fd, &pkt, &net->address);
|
||||
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) {
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
#include <GearSrc/Log.h>
|
||||
|
||||
#include <stb_ds.h>
|
||||
|
||||
GSNetServer GSNetServerOpen(GSServer server, int port) {
|
||||
GSNetServer net = malloc(sizeof(*net));
|
||||
|
||||
|
|
@ -20,6 +22,28 @@ GSNetServer GSNetServerOpen(GSServer server, int port) {
|
|||
}
|
||||
|
||||
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) {
|
||||
|
|
|
|||
|
|
@ -51,7 +51,6 @@ void GSNetStateRead(GSNetState* state, int fd, GSNetPacket* packet, GSNetAddress
|
|||
}
|
||||
|
||||
void GSNetStateWrite(GSNetState* state, int fd, GSNetAddress* address){
|
||||
|
||||
if(arrlen(state->tx) > 0){
|
||||
if(state->txstate == Acknowledged){
|
||||
int n = state->tx[0].size;
|
||||
|
|
@ -69,12 +68,18 @@ void GSNetStateWrite(GSNetState* state, int fd, GSNetAddress* address){
|
|||
|
||||
t = GSEndianSwapU32BE(state->txtotal);
|
||||
|
||||
pkt.header.flag = 0;
|
||||
pkt.header.index = state->txindex;
|
||||
pkt.header.seq = state->txseq;
|
||||
memcpy(pkt.data, &t, 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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue