wip
This commit is contained in:
parent
5c653ffd6a
commit
3ce889edf5
9 changed files with 84 additions and 17 deletions
|
|
@ -25,13 +25,17 @@ static int new_socket(void) {
|
|||
}
|
||||
|
||||
GSBool GSNetBaseHasData(int fd) {
|
||||
fd_set fds;
|
||||
fd_set fds;
|
||||
struct timeval tv;
|
||||
|
||||
tv.tv_sec = 0;
|
||||
tv.tv_usec = 0;
|
||||
|
||||
FD_ZERO(&fds);
|
||||
|
||||
FD_SET(fd, &fds);
|
||||
|
||||
select(FD_SETSIZE, &fds, NULL, NULL, NULL);
|
||||
select(FD_SETSIZE, &fds, NULL, NULL, &tv);
|
||||
|
||||
if(FD_ISSET(fd, &fds)) return GSTrue;
|
||||
|
||||
|
|
|
|||
|
|
@ -19,8 +19,39 @@ GSNetClient GSNetClientOpen(GSClient client, const char* hostname, int port) {
|
|||
return net;
|
||||
}
|
||||
|
||||
void GSNetClientClose(GSNetClient client) {
|
||||
if(client->fd >= 0) GSNetBaseClose(client->fd);
|
||||
enum states {
|
||||
Acknowledged = 0,
|
||||
WaitingAcknowledge
|
||||
};
|
||||
|
||||
free(client);
|
||||
void GSNetClientStep(GSNetClient net) {
|
||||
GSNetPacket pkt;
|
||||
GSNetAddress addr;
|
||||
|
||||
while(GSNetBaseHasData(net->fd)) {
|
||||
GSNetPacketRead(net->fd, &pkt, &addr);
|
||||
|
||||
if(pkt.header.flag & GSNetPacketFlagAcknowledge) {
|
||||
if(net->txstate == WaitingAcknowledge && net->txindex == pkt.header.index && net->txseq == pkt.header.seq) {
|
||||
GSLog(net->engine, GSLogDebug, "ACK received for %d:%d", net->txindex, net->txseq);
|
||||
|
||||
if(net->txseq == net->txtotal) net->txstate = Acknowledged;
|
||||
}
|
||||
} else {
|
||||
if(net->rxstate == Acknowledged && net->rxindex == pkt.header.index && net->rxseq == pkt.header.seq) {
|
||||
pkt.header.flag |= GSNetPacketFlagAcknowledge;
|
||||
pkt.header.index = net->rxindex;
|
||||
pkt.header.seq = net->rxseq;
|
||||
pkt.size = 0;
|
||||
|
||||
GSNetPacketWrite(net->fd, &pkt, &addr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void GSNetClientClose(GSNetClient net) {
|
||||
if(net->fd >= 0) GSNetBaseClose(net->fd);
|
||||
|
||||
free(net);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,16 +10,16 @@ void GSNetPacketRead(int fd, GSNetPacket* packet, GSNetAddress* address) {
|
|||
memcpy(&packet->header, buf, sizeof(packet->header));
|
||||
memcpy(packet->data, buf + sizeof(packet->header), packet->size);
|
||||
|
||||
packet->header.index = GSEndianSwapU32BE(packet->header.index);
|
||||
packet->header.sequence = GSEndianSwapU32BE(packet->header.sequence);
|
||||
packet->header.index = GSEndianSwapU32BE(packet->header.index);
|
||||
packet->header.seq = GSEndianSwapU32BE(packet->header.seq);
|
||||
}
|
||||
|
||||
void GSNetPacketWrite(int fd, GSNetPacket* packet, GSNetAddress* address) {
|
||||
GSNetPacketHeader header = packet->header;
|
||||
unsigned char buf[508];
|
||||
|
||||
header.index = GSEndianSwapU32BE(header.index);
|
||||
header.sequence = GSEndianSwapU32BE(header.sequence);
|
||||
header.index = GSEndianSwapU32BE(header.index);
|
||||
header.seq = GSEndianSwapU32BE(header.seq);
|
||||
|
||||
memcpy(buf, &header, sizeof(header));
|
||||
memcpy(buf + sizeof(header), packet->data, packet->size);
|
||||
|
|
|
|||
|
|
@ -19,8 +19,11 @@ GSNetServer GSNetServerOpen(GSServer server, int port) {
|
|||
return net;
|
||||
}
|
||||
|
||||
void GSNetServerClose(GSNetServer server) {
|
||||
if(server->fd >= 0) GSNetBaseClose(server->fd);
|
||||
|
||||
free(server);
|
||||
void GSNetServerStep(GSNetServer net) {
|
||||
}
|
||||
|
||||
void GSNetServerClose(GSNetServer net) {
|
||||
if(net->fd >= 0) GSNetBaseClose(net->fd);
|
||||
|
||||
free(net);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue