Pre big refactor.
This commit is contained in:
@ -38,20 +38,23 @@ void cmdLeave(const consolecmdexec_t *exec) {
|
|||||||
|
|
||||||
void clientInit() {
|
void clientInit() {
|
||||||
memoryZero(&CLIENT, sizeof(client_t));
|
memoryZero(&CLIENT, sizeof(client_t));
|
||||||
|
|
||||||
consoleRegCmd("join", cmdJoin);
|
consoleRegCmd("join", cmdJoin);
|
||||||
consoleRegCmd("leave", cmdLeave);
|
consoleRegCmd("leave", cmdLeave);
|
||||||
}
|
}
|
||||||
|
|
||||||
errorret_t clientConnect(const clientconnect_t connect) {
|
errorret_t clientConnect(const clientconnect_t connect) {
|
||||||
errorret_t ret;
|
errorret_t ret;
|
||||||
|
|
||||||
|
// Don't connect if already connected.
|
||||||
if(CLIENT.state != CLIENT_STATE_DISCONNECTED) {
|
if(CLIENT.state != CLIENT_STATE_DISCONNECTED) {
|
||||||
return error("Client is already connected");
|
return error("Client is already connected");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Init the client.
|
||||||
CLIENT.type = connect.type;
|
CLIENT.type = connect.type;
|
||||||
packetQueueInit(&CLIENT.packetQueue);
|
packetQueueInit(&CLIENT.packetQueue);
|
||||||
|
|
||||||
|
// Change how we connect based on the type.
|
||||||
switch(connect.type) {
|
switch(connect.type) {
|
||||||
case CLIENT_TYPE_NETWORKED:
|
case CLIENT_TYPE_NETWORKED:
|
||||||
ret = networkedClientConnect(&CLIENT, connect.networked);
|
ret = networkedClientConnect(&CLIENT, connect.networked);
|
||||||
@ -61,6 +64,7 @@ errorret_t clientConnect(const clientconnect_t connect) {
|
|||||||
assertUnreachable("Invalid client type");
|
assertUnreachable("Invalid client type");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Should be connected now.
|
||||||
if(ret != ERROR_OK) CLIENT.state = CLIENT_STATE_DISCONNECTED;
|
if(ret != ERROR_OK) CLIENT.state = CLIENT_STATE_DISCONNECTED;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -70,24 +74,28 @@ void clientUpdate() {
|
|||||||
int32_t ret;
|
int32_t ret;
|
||||||
errorret_t err;
|
errorret_t err;
|
||||||
|
|
||||||
|
// Don't do anything if not connected
|
||||||
if(CLIENT.state == CLIENT_STATE_DISCONNECTED) return;
|
if(CLIENT.state == CLIENT_STATE_DISCONNECTED) return;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
// Pop the packet off the queue.
|
||||||
ret = packetQueuePopIn(
|
ret = packetQueuePopIn(
|
||||||
&CLIENT.packetQueue,
|
&CLIENT.packetQueue,
|
||||||
&packet
|
&packet
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// No more packets to process, just break out.
|
||||||
if(ret == 0) break;
|
if(ret == 0) break;
|
||||||
|
|
||||||
|
// An error occured?
|
||||||
if(ret < 0) {
|
if(ret < 0) {
|
||||||
clientDisconnect();
|
clientDisconnect();
|
||||||
consolePrint("Failed to pop packet");
|
consolePrint("Failed to pop packet");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Process the packet
|
||||||
err = packetClientProcess(&packet, &CLIENT);
|
err = packetClientProcess(&packet, &CLIENT);
|
||||||
|
|
||||||
if(err != ERROR_OK) {
|
if(err != ERROR_OK) {
|
||||||
clientDisconnect();
|
clientDisconnect();
|
||||||
consolePrint("Failed to process packet %s", errorString());
|
consolePrint("Failed to process packet %s", errorString());
|
||||||
@ -98,8 +106,10 @@ void clientUpdate() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void clientDisconnect() {
|
void clientDisconnect() {
|
||||||
|
// Don't disconnect if already disconnected.
|
||||||
if(CLIENT.state == CLIENT_STATE_DISCONNECTED) return;
|
if(CLIENT.state == CLIENT_STATE_DISCONNECTED) return;
|
||||||
|
|
||||||
|
// Disconnect the client.
|
||||||
switch(CLIENT.type) {
|
switch(CLIENT.type) {
|
||||||
case CLIENT_TYPE_NETWORKED:
|
case CLIENT_TYPE_NETWORKED:
|
||||||
networkedClientDisconnect(&CLIENT);
|
networkedClientDisconnect(&CLIENT);
|
||||||
@ -112,10 +122,6 @@ void clientDisconnect() {
|
|||||||
consolePrint("Client disconnected");
|
consolePrint("Client disconnected");
|
||||||
}
|
}
|
||||||
|
|
||||||
void clientProcess() {
|
|
||||||
if(CLIENT.state == CLIENT_STATE_DISCONNECTED) return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void clientDispose() {
|
void clientDispose() {
|
||||||
clientDisconnect();
|
clientDisconnect();
|
||||||
}
|
}
|
@ -15,7 +15,7 @@ typedef enum {
|
|||||||
} clienttype_t;
|
} clienttype_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
CLIENT_STATE_DISCONNECTED,
|
CLIENT_STATE_DISCONNECTED = 0,
|
||||||
CLIENT_STATE_CONNECTING,
|
CLIENT_STATE_CONNECTING,
|
||||||
CLIENT_STATE_CONNECTED,
|
CLIENT_STATE_CONNECTED,
|
||||||
CLIENT_STATE_DISCONNECTING,
|
CLIENT_STATE_DISCONNECTING,
|
||||||
@ -32,7 +32,6 @@ typedef struct client_s {
|
|||||||
clientstate_t state;
|
clientstate_t state;
|
||||||
clienttype_t type;
|
clienttype_t type;
|
||||||
packetqueue_t packetQueue;
|
packetqueue_t packetQueue;
|
||||||
|
|
||||||
union {
|
union {
|
||||||
networkedclient_t networked;
|
networkedclient_t networked;
|
||||||
};
|
};
|
||||||
|
@ -18,10 +18,12 @@ errorret_t networkedClientConnect(
|
|||||||
errorret_t err;
|
errorret_t err;
|
||||||
char_t *ip = "127.0.0.1";
|
char_t *ip = "127.0.0.1";
|
||||||
|
|
||||||
|
// Validate the params
|
||||||
assertNotNull(client, "Client is NULL");
|
assertNotNull(client, "Client is NULL");
|
||||||
assertTrue(client->type == CLIENT_TYPE_NETWORKED, "Client is not networked");
|
assertTrue(client->type == CLIENT_TYPE_NETWORKED, "Client is not networked");
|
||||||
assertIsMainThread("Client connect must be on main thread");
|
assertIsMainThread("Client connect must be on main thread");
|
||||||
|
|
||||||
|
// Set the state to connecting.
|
||||||
client->state = CLIENT_STATE_CONNECTING;
|
client->state = CLIENT_STATE_CONNECTING;
|
||||||
consolePrint("Connecting to server %s:%d", ip, connInfo.port);
|
consolePrint("Connecting to server %s:%d", ip, connInfo.port);
|
||||||
|
|
||||||
@ -38,7 +40,6 @@ errorret_t networkedClientConnect(
|
|||||||
client->networked.address.sin_family = AF_INET;
|
client->networked.address.sin_family = AF_INET;
|
||||||
client->networked.address.sin_port = htons(connInfo.port);
|
client->networked.address.sin_port = htons(connInfo.port);
|
||||||
client->networked.address.sin_addr.s_addr = inet_addr(ip);
|
client->networked.address.sin_addr.s_addr = inet_addr(ip);
|
||||||
|
|
||||||
ret = inet_pton(AF_INET, ip, &client->networked.address.sin_addr);
|
ret = inet_pton(AF_INET, ip, &client->networked.address.sin_addr);
|
||||||
if(ret <= 0) {
|
if(ret <= 0) {
|
||||||
close(client->networked.socket);
|
close(client->networked.socket);
|
||||||
@ -69,11 +70,9 @@ errorret_t networkedClientConnect(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize mutex and condition variable
|
// Initialize mutexes and locks and condition variable
|
||||||
pthread_mutex_init(&client->networked.lock, NULL);
|
pthread_mutex_init(&client->networked.lock, NULL);
|
||||||
pthread_cond_init(&client->networked.cond, NULL);
|
pthread_cond_init(&client->networked.cond, NULL);
|
||||||
|
|
||||||
// Initialize read and write locks
|
|
||||||
pthread_mutex_init(&client->networked.readLock, NULL);
|
pthread_mutex_init(&client->networked.readLock, NULL);
|
||||||
pthread_mutex_init(&client->networked.writeLock, NULL);
|
pthread_mutex_init(&client->networked.writeLock, NULL);
|
||||||
|
|
||||||
@ -88,20 +87,20 @@ errorret_t networkedClientConnect(
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// We should now receive a welcome packet
|
// We should now receive a welcome packet or a disconnect packet.
|
||||||
err = networkedClientReadPacket(client, &packet);
|
err = networkedClientReadPacket(client, &packet);
|
||||||
if(err) return err;
|
if(err) return err;
|
||||||
switch(packet.type) {
|
switch(packet.type) {
|
||||||
|
case PACKET_TYPE_WELCOME:
|
||||||
|
err = packetWelcomeClientProcess(&packet, client);
|
||||||
|
if(err) return err;
|
||||||
|
break;
|
||||||
|
|
||||||
case PACKET_TYPE_DISCONNECT:
|
case PACKET_TYPE_DISCONNECT:
|
||||||
err = packetDisconnectClientProcess(&packet, client);
|
err = packetDisconnectClientProcess(&packet, client);
|
||||||
if(err) return err;
|
if(err) return err;
|
||||||
return error("Server disconnected");
|
return error("Server disconnected");
|
||||||
|
|
||||||
case PACKET_TYPE_WELCOME:
|
|
||||||
err = packetWelcomeClient(&packet);
|
|
||||||
if(err) return err;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return error("Server did not send welcome message.");
|
return error("Server did not send welcome message.");
|
||||||
}
|
}
|
||||||
@ -113,7 +112,6 @@ errorret_t networkedClientConnect(
|
|||||||
networkedClientReadThread,
|
networkedClientReadThread,
|
||||||
client
|
client
|
||||||
);
|
);
|
||||||
|
|
||||||
if(ret != 0) {
|
if(ret != 0) {
|
||||||
close(client->networked.socket);
|
close(client->networked.socket);
|
||||||
pthread_mutex_destroy(&client->networked.readLock);
|
pthread_mutex_destroy(&client->networked.readLock);
|
||||||
@ -138,7 +136,6 @@ errorret_t networkedClientConnect(
|
|||||||
networkedClientWriteThread, // Renamed from networkedClientRightThread
|
networkedClientWriteThread, // Renamed from networkedClientRightThread
|
||||||
client
|
client
|
||||||
);
|
);
|
||||||
|
|
||||||
if(ret != 0) {
|
if(ret != 0) {
|
||||||
close(client->networked.socket);
|
close(client->networked.socket);
|
||||||
pthread_mutex_destroy(&client->networked.readLock);
|
pthread_mutex_destroy(&client->networked.readLock);
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
packethandler_t PACKET_HANDLERS[] = {
|
packethandler_t PACKET_HANDLERS[] = {
|
||||||
{ NULL, NULL },
|
{ NULL, NULL },
|
||||||
{ NULL, NULL },
|
{ packetWelcomeClientProcess, NULL },
|
||||||
{ packetDisconnectClientProcess, NULL },
|
{ packetDisconnectClientProcess, NULL },
|
||||||
{ packetPingClientProcess, packetPingServerProcess },
|
{ packetPingClientProcess, packetPingServerProcess },
|
||||||
};
|
};
|
||||||
|
@ -31,21 +31,22 @@ errorret_t packetDisconnectClientProcess(
|
|||||||
return error("Disconnect packet length is not correct");
|
return error("Disconnect packet length is not correct");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Handle disconnect reasons better.
|
||||||
packetdisconnect_t *data = (packetdisconnect_t *)&packet->data;
|
packetdisconnect_t *data = (packetdisconnect_t *)&packet->data;
|
||||||
switch(data->reason) {
|
// switch(data->reason) {
|
||||||
case PACKET_DISCONNECT_REASON_UNKNOWN:
|
// case PACKET_DISCONNECT_REASON_UNKNOWN:
|
||||||
return error("Server disconnected: Unknown reason");
|
// return error("Server disconnected: Unknown reason");
|
||||||
case PACKET_DISCONNECT_REASON_INVALID_VERSION:
|
// case PACKET_DISCONNECT_REASON_INVALID_VERSION:
|
||||||
return error("Server disconnected: Invalid version");
|
// return error("Server disconnected: Invalid version");
|
||||||
case PACKET_DISCONNECT_REASON_MALFORMED_PACKET:
|
// case PACKET_DISCONNECT_REASON_MALFORMED_PACKET:
|
||||||
return error("Server disconnected: Malformed packet");
|
// return error("Server disconnected: Malformed packet");
|
||||||
case PACKET_DISCONNECT_REASON_SERVER_FULL:
|
// case PACKET_DISCONNECT_REASON_SERVER_FULL:
|
||||||
return error("Server disconnected: Server full");
|
// return error("Server disconnected: Server full");
|
||||||
case PACKET_DISCONNECT_REASON_SERVER_SHUTDOWN:
|
// case PACKET_DISCONNECT_REASON_SERVER_SHUTDOWN:
|
||||||
return error("Server disconnected: Server shutdown");
|
// return error("Server disconnected: Server shutdown");
|
||||||
default:
|
// default:
|
||||||
return error("Server disconnected: Unknown reason");
|
// return error("Server disconnected: Unknown reason");
|
||||||
}
|
// }
|
||||||
|
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
@ -26,6 +26,10 @@ void packetWelcomeCreate(packet_t *packet);
|
|||||||
* Handles a welcome packet received FROM a server INTO a client.
|
* Handles a welcome packet received FROM a server INTO a client.
|
||||||
*
|
*
|
||||||
* @param packet Pointer to the packet structure to handle.
|
* @param packet Pointer to the packet structure to handle.
|
||||||
|
* @param client Pointer to the client structure.
|
||||||
* @return ERROR_OK on success, or an error code on failure.
|
* @return ERROR_OK on success, or an error code on failure.
|
||||||
*/
|
*/
|
||||||
errorret_t packetWelcomeClient(packet_t *packet);
|
errorret_t packetWelcomeClientProcess(
|
||||||
|
const packet_t *packet,
|
||||||
|
client_t *client
|
||||||
|
);
|
Reference in New Issue
Block a user