adding multiplayer
This commit is contained in:
@@ -1,5 +1,11 @@
|
||||
target_sources(${PROJECT_NAME} PRIVATE
|
||||
game_client.c
|
||||
server.c
|
||||
transactions.c
|
||||
)
|
||||
|
||||
add_executable(
|
||||
gameServer
|
||||
server.c
|
||||
transactions.c
|
||||
main.c
|
||||
)
|
||||
|
||||
@@ -1,28 +1,115 @@
|
||||
#include "game_client.h"
|
||||
#include "transactions.h"
|
||||
#include "../game_source/color.h"
|
||||
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
|
||||
int Connect(game_server* gs) {
|
||||
struct sockaddr_in serverAddr;
|
||||
serverAddr.sin_family = AF_INET;
|
||||
serverAddr.sin_port = htons(gs->info.port);
|
||||
struct sockaddr_in game_serverAddr;
|
||||
struct sockaddr_in server_serverAddr;
|
||||
|
||||
gs->game_info.port = 2223;
|
||||
gs->game_info.ip = "192.168.254.74";
|
||||
|
||||
gs->server_info.port = 2224;
|
||||
gs->server_info.ip = "192.168.254.74";
|
||||
|
||||
game_serverAddr.sin_family = AF_INET;
|
||||
game_serverAddr.sin_port = htons(2223);
|
||||
game_serverAddr.sin_family = AF_INET;
|
||||
|
||||
server_serverAddr.sin_port = htons(2223);
|
||||
server_serverAddr.sin_addr.s_addr = INADDR_ANY;
|
||||
server_serverAddr.sin_addr.s_addr = INADDR_ANY;
|
||||
int blocking_mode = 1;
|
||||
|
||||
|
||||
gs->socket = socket(AF_INET, SOCK_STREAM, 0);
|
||||
inet_pton(AF_INET, gs->info.ip, &serverAddr.sin_addr);
|
||||
gs->game_info.socket = socket(AF_INET, SOCK_STREAM, 0);
|
||||
|
||||
if(connect(gs->socket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {
|
||||
ioctl(gs->socket, FIONBIO, &blocking_mode); // Shuld be 1
|
||||
gs->server_info.socket = socket(AF_INET, SOCK_STREAM, 0);
|
||||
inet_pton(AF_INET, gs->game_info.ip, &game_serverAddr.sin_addr);
|
||||
|
||||
if(connect(gs->server_info.socket, (struct sockaddr*)&game_serverAddr, sizeof(game_serverAddr)) < 0) {
|
||||
//ioctl(gs->server_info.socket, FIONBIO, &blocking_mode); // Shuld be 1
|
||||
|
||||
server_transaction st;
|
||||
server_transaction rst;
|
||||
memset(&st, 0, sizeof(server_transaction));
|
||||
|
||||
st.id = SERVER_T_SERVER_FLAG;
|
||||
st.action = SERVER_T_CONNECT;
|
||||
st.argsize = 0;
|
||||
st.serverArg = 0;
|
||||
|
||||
SendServerTransaction(&st, gs->server_info.socket);
|
||||
if(RecvServerTransaction(&rst, gs->server_info.socket)) {
|
||||
printf("server transaction failed\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(rst.id == SERVER_T_SERVER_FLAG && rst.action == SERVER_T_CONNECT) {
|
||||
memcpy(&gs->game_info.id, rst.serverArg, sizeof(int));
|
||||
|
||||
char* ip = malloc((rst.argsize - sizeof(int)) + 1);
|
||||
strncpy(ip, rst.serverArg + sizeof(int), (rst.argsize - sizeof(int)) + 1);
|
||||
ip[rst.argsize - sizeof(int)] = '\0';
|
||||
|
||||
printf("Connecting to server %s\n", ip);
|
||||
|
||||
inet_pton(AF_INET, ip, &game_serverAddr.sin_addr);
|
||||
if(connect(gs->game_info.socket, (struct sockaddr*)&game_serverAddr, sizeof(game_serverAddr)) <= 0) {
|
||||
printf("Could not connect to server \"%s\"\n", ip);
|
||||
free(ip);
|
||||
return -1;
|
||||
|
||||
}
|
||||
free(ip);
|
||||
|
||||
color rcolor = {rand()%250, rand()%250, rand()%250};
|
||||
user_transaction ut = {
|
||||
.id = SERVER_T_USER_FLAG,
|
||||
.action = SERVER_T_CONNECT,
|
||||
.argsize = sizeof(color),
|
||||
.userArg = &rcolor,
|
||||
};
|
||||
|
||||
user_transaction rut = {0};
|
||||
|
||||
SendUserTransaction(&ut, gs->game_info.socket);
|
||||
|
||||
if(RecvUserTransaction(&rut, gs->game_info.socket)) {
|
||||
printf("Could not get other users\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(rut.id == SERVER_T_GET_PLAYER_DATA && rut.action == SERVER_T_SET_PLAYER_ID) {
|
||||
//player *players = malloc(rut.argsize/sizeof(player));
|
||||
//memcpy(players, rut.userArg, rut.argsize);
|
||||
FreeUserTransaction(&rut);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
SendServerTransaction(&st, gs->server_info.socket);
|
||||
if(RecvServerTransaction(&rst, gs->server_info.socket)) {
|
||||
printf("server failed to get Player data");
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
printf("ng\n");
|
||||
return -1;
|
||||
}
|
||||
int Client_Send(game_server* gs,packet* packet) {
|
||||
@@ -32,22 +119,22 @@ int Client_Send(game_server* gs,packet* packet) {
|
||||
memcpy(buffer+sizeof(int), &packet->size, sizeof(int));
|
||||
memcpy(buffer+sizeof(int)+sizeof(int), &packet->packet, packet->size);
|
||||
|
||||
write(gs->socket, buffer, sendPacketSize);
|
||||
write(gs->game_info.socket, buffer, sendPacketSize);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int Client_Recive(game_server* gs, packet* packet) {
|
||||
|
||||
if(read(gs->socket, &packet->packetTpye, sizeof(int)) <= 0) {
|
||||
if(read(gs->game_info.socket, &packet->packetTpye, sizeof(int)) <= 0) {
|
||||
return 0;
|
||||
}
|
||||
if(read(gs->socket, &packet->size, sizeof(int)) <= 0 ) {
|
||||
if(read(gs->game_info.socket, &packet->size, sizeof(int)) <= 0 ) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
packet->packet = malloc(packet->size);
|
||||
|
||||
if(read(gs->socket, &packet->packet, packet->size) <= 0) {
|
||||
if(read(gs->game_info.socket, &packet->packet, packet->size) <= 0) {
|
||||
free(packet->packet);
|
||||
return -1;
|
||||
}
|
||||
@@ -55,6 +142,15 @@ int Client_Recive(game_server* gs, packet* packet) {
|
||||
}
|
||||
|
||||
int Disconnect(game_server* gs) {
|
||||
close(gs->socket);
|
||||
server_transaction st = {
|
||||
.id = SERVER_T_SERVER_FLAG,
|
||||
.action = SERVER_T_DISCONNECT,
|
||||
.argsize = 0,
|
||||
.serverArg = 0,
|
||||
|
||||
};
|
||||
SendServerTransaction(&st, gs->server_info.socket);
|
||||
close(gs->game_info.socket);
|
||||
close(gs->server_info.socket);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -7,11 +7,13 @@ typedef struct {
|
||||
const char* ip;
|
||||
int port;
|
||||
int id;
|
||||
int socket;
|
||||
} server_info;
|
||||
|
||||
typedef struct {
|
||||
int socket;
|
||||
server_info info;
|
||||
server_info game_info;
|
||||
server_info server_info;
|
||||
int userCount;
|
||||
}game_server;
|
||||
|
||||
int Connect(game_server* gs);
|
||||
|
||||
63
source/server_source/main.c
Normal file
63
source/server_source/main.c
Normal file
@@ -0,0 +1,63 @@
|
||||
#include "server.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "transactions.h"
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include "../game_source/vector.h"
|
||||
#include <time.h>
|
||||
|
||||
|
||||
void Vec2Transacgtion(user_transaction* t, vec2* v) {
|
||||
memcpy(v, t->userArg, t->argsize);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
s_game_server s;
|
||||
memset(&s,0,sizeof(s));
|
||||
int serverEnd = 0;
|
||||
|
||||
user_transaction st1;
|
||||
user_transaction st2;
|
||||
user_transaction rst1;
|
||||
user_transaction rst2;
|
||||
memset(&st1,0,sizeof(st1));
|
||||
memset(&st2,0,sizeof(st2));
|
||||
memset(&rst1,0,sizeof(rst1));
|
||||
memset(&rst2,0,sizeof(rst2));
|
||||
vec2 pos = {10,10};
|
||||
struct timespec last_time;
|
||||
clock_gettime(CLOCK_MONOTONIC,&last_time);
|
||||
|
||||
st1 = (user_transaction){
|
||||
.userArg = &pos,
|
||||
.action = 1,
|
||||
.id = SERVER_T_USER_FLAG,
|
||||
.argsize = 8,
|
||||
};
|
||||
st2 = (user_transaction){
|
||||
.userArg = &pos,
|
||||
.action = 1,
|
||||
.id = SERVER_T_USER_FLAG,
|
||||
.argsize = 8,
|
||||
};
|
||||
|
||||
start_server(&s);
|
||||
do {
|
||||
int new_client = 0;
|
||||
if((new_client = accept_client(&s)) > 0) {
|
||||
printf("connection!\n");
|
||||
//if(get_player_data(&s,new_client)) {
|
||||
// close(new_client);
|
||||
//}
|
||||
//
|
||||
}
|
||||
|
||||
}while(!serverEnd);
|
||||
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,29 +1,160 @@
|
||||
#include "server.h"
|
||||
#include "transactions.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <time.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/socket.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int start_server() {
|
||||
|
||||
int start_server(s_game_server* s) {
|
||||
struct sockaddr_in server;
|
||||
int serverSock;
|
||||
|
||||
serverSock = socket(AF_INET, SOCK_STREAM, 0);
|
||||
s->sock = socket(AF_INET, SOCK_STREAM, 0);
|
||||
|
||||
server.sin_family = AF_INET;
|
||||
server.sin_port = htons(2223);
|
||||
server.sin_addr.s_addr = INADDR_ANY;
|
||||
|
||||
if(bind(serverSock, (struct sockaddr*)&serverSock, sizeof(server)) < 0) {
|
||||
if(bind(s->sock, (struct sockaddr*)&server, sizeof(server)) < 0) {
|
||||
printf("could not bind socket\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
listen(serverSock, 4);
|
||||
|
||||
int blocking_mode = 1;
|
||||
|
||||
ioctl(s->sock, FIONBIO, &blocking_mode); // Shuld be 1
|
||||
|
||||
printf("lissening\n");
|
||||
listen(s->sock, 4);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int accept_client(s_game_server* s) {
|
||||
struct sockaddr_in addr;
|
||||
socklen_t client_addr_size;
|
||||
|
||||
client_addr_size = sizeof(addr);
|
||||
int tmp = accept(s->sock, (struct sockaddr*)&addr, &client_addr_size);
|
||||
if(tmp == -1) {
|
||||
// return -1;
|
||||
} else {
|
||||
for (int i = 0; i < 4; i++) {
|
||||
if(s->clients[i].sock == 0) {
|
||||
s->clients[i].sock = tmp;
|
||||
s->clients[i].userId = rand();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//server_transaction st;
|
||||
//memset(&st, 0, sizeof(st));
|
||||
//st.id = SERVER_T_SERVER_FLAG;
|
||||
//st.action = SERVER_T_SET_PLAYER_ID;
|
||||
//st.argsize = sizeof(int);
|
||||
//st.serverArg =
|
||||
|
||||
|
||||
//SendServerTransaction(&st, tmp);
|
||||
|
||||
//user_transaction ut;
|
||||
//memset(&ut, 0, sizeof(user_transaction));
|
||||
|
||||
//for(int i = 0; i < 4; i++) {
|
||||
// if(s->clients[i].sock != 0) {
|
||||
// RecvUserTransaction(&ut, s->sock);
|
||||
|
||||
// }
|
||||
//}
|
||||
// accempt client
|
||||
// send world seed
|
||||
// send player colors
|
||||
// player data
|
||||
// - class
|
||||
// - level
|
||||
// - items
|
||||
// - etc
|
||||
return tmp;
|
||||
}
|
||||
|
||||
int limit_fps(int fps, struct timespec* last_time) {
|
||||
struct timespec current_time;
|
||||
double frame_time = 1.0/fps;
|
||||
|
||||
clock_gettime(CLOCK_MONOTONIC, ¤t_time);
|
||||
|
||||
double elapsed = (current_time.tv_sec - last_time->tv_sec) +
|
||||
(current_time.tv_nsec - last_time->tv_nsec) / 1e9;
|
||||
|
||||
if (elapsed < frame_time) {
|
||||
return 0;
|
||||
}
|
||||
clock_gettime(CLOCK_MONOTONIC, last_time);
|
||||
|
||||
return 1;
|
||||
|
||||
}
|
||||
|
||||
int server_update(s_game_server* gs) {
|
||||
if(limit_fps(60, &gs->current_time)) {
|
||||
for(int i = 0; i < 4; i++) {
|
||||
if(gs->clients[0].sock > 0 && gs->clients[1].sock > 0) {
|
||||
|
||||
if(rst2.userArg != 0) {
|
||||
FreeUserTransaction(&rst2);
|
||||
}
|
||||
if(RecvUserTransaction(&rst2, s.clients[0].sock)){
|
||||
st2 = rst2;
|
||||
}
|
||||
SendUserTransaction(&st2, s.clients[1].sock);
|
||||
SendUserTransaction(&st1, s.clients[0].sock);
|
||||
|
||||
if(rst1.userArg != 0) {
|
||||
FreeUserTransaction(&rst1);
|
||||
}
|
||||
if(RecvUserTransaction(&rst1, s.clients[1].sock)) {
|
||||
st1 = rst1;
|
||||
}
|
||||
SendUserTransaction(&st1, s.clients[0].sock);
|
||||
SendUserTransaction(&st2, s.clients[1].sock);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
//int get_player_data(s_game_server* s, int client) {
|
||||
//
|
||||
// server_transaction st;
|
||||
// server_transaction rst;
|
||||
// memset(&st,0,sizeof(st));
|
||||
// memset(&rst,0,sizeof(rst));
|
||||
//
|
||||
// st.id = SERVER_T_SERVER_FLAG & SERVER_T_REQUEST;
|
||||
// st.action = SERVER_T_GET_PLAYER_DATA;
|
||||
//
|
||||
// printf("Getting Player Data\n");
|
||||
//
|
||||
//
|
||||
// if(!SendServerTransaction(&st, client)) {
|
||||
// return -1;
|
||||
// }
|
||||
//
|
||||
// if(RecvServerTransaction(&rst, client)) {
|
||||
// return -1;
|
||||
// }
|
||||
// return 0;
|
||||
//}
|
||||
//
|
||||
|
||||
@@ -2,13 +2,23 @@
|
||||
#define SERVER_H
|
||||
|
||||
#include "transactions.h"
|
||||
#include <time.h>
|
||||
|
||||
typedef struct {
|
||||
} client;
|
||||
int sock;
|
||||
int userId;
|
||||
} s_game_client;
|
||||
typedef struct {
|
||||
} client_manager;
|
||||
s_game_client clients[4];
|
||||
int number_of_clients;
|
||||
int sock;
|
||||
struct timespec current_time;
|
||||
|
||||
int start_server();
|
||||
} s_game_server;
|
||||
|
||||
int start_server(s_game_server* s);
|
||||
int accept_client(s_game_server* s);
|
||||
int server_update(s_game_server* gs);
|
||||
int get_player_data(s_game_server* s, int client);
|
||||
|
||||
#endif // !SERVER_H
|
||||
|
||||
@@ -1,32 +1,79 @@
|
||||
#include "transactions.h"
|
||||
#include <asm-generic/errno.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/socket.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define PORT 2223
|
||||
#define IP_ADDRESS "127.0.0.1"
|
||||
|
||||
|
||||
int CreateTransaction(action *act) {
|
||||
packet* CreateServerTransaction(server_transaction *act) {
|
||||
|
||||
int bufferSize = sizeof(int)*3 + act->argsize;
|
||||
|
||||
//unsigned char* buffer = malloc(bufferSize);
|
||||
unsigned char* buffer = malloc(bufferSize);
|
||||
if( buffer <= 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//buffer[0] = act->id;
|
||||
//buffer[sizeof(int)*1] = act->action;
|
||||
//buffer[sizeof(int)*2] = act->argsize;
|
||||
//memcpy(&buffer[sizeof(int)*3], act->userArg, act->argsize);
|
||||
printf("transaction id: %d, action %d, argsize %d\n", act->id, act->action, act->argsize);
|
||||
|
||||
memcpy(buffer, &act->id, sizeof(int));
|
||||
memcpy(&buffer[sizeof(int)*1], &act->action, sizeof(int));
|
||||
memcpy(&buffer[sizeof(int)*2], &act->argsize, sizeof(int));
|
||||
memcpy(&buffer[sizeof(int)*3], act->serverArg, act->argsize);
|
||||
|
||||
packet* p = malloc(sizeof(packet));
|
||||
if(p <= 0) {
|
||||
return NULL;
|
||||
}
|
||||
p->packetTpye = SERVER_PACKET;
|
||||
p->size = bufferSize;
|
||||
p->packet = buffer;
|
||||
|
||||
//free(buffer);
|
||||
|
||||
return 0;
|
||||
return p;
|
||||
}
|
||||
packet* CreateUserTransaction(user_transaction *act) {
|
||||
int bufferSize = sizeof(int)*3 + act->argsize;
|
||||
|
||||
unsigned char* buffer = malloc(bufferSize);
|
||||
if( buffer <= 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//printf("transaction id: %d, action %d, argsize %d\n", act->id, act->action, act->argsize);
|
||||
|
||||
memcpy(buffer, &act->id, sizeof(int));
|
||||
memcpy(&buffer[sizeof(int)*1], &act->action, sizeof(int));
|
||||
memcpy(&buffer[sizeof(int)*2], &act->argsize, sizeof(int));
|
||||
memcpy(&buffer[sizeof(int)*3], act->userArg, act->argsize);
|
||||
|
||||
packet* p = malloc(sizeof(packet));
|
||||
if(p <= 0) {
|
||||
return NULL;
|
||||
}
|
||||
p->packetTpye = SERVER_PACKET;
|
||||
p->size = bufferSize;
|
||||
p->packet = buffer;
|
||||
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
int GetTransaction(action *act) {
|
||||
void FreePacket(packet* p) {
|
||||
free(p->packet);
|
||||
free(p);
|
||||
|
||||
}
|
||||
|
||||
|
||||
int GetTransaction(user_transaction *act) {
|
||||
|
||||
|
||||
int id;
|
||||
@@ -45,6 +92,163 @@ int GetTransaction(action *act) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ProssesTransaction(action *act) {
|
||||
int ProssesTransaction(user_transaction *act) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define PACKET_SIZE(p) sizeof(int) + sizeof(int) + p->size
|
||||
|
||||
int SendServerTransaction(server_transaction *tract, int fd) {
|
||||
packet* p = CreateServerTransaction(tract);
|
||||
|
||||
int packetSize = PACKET_SIZE(p);
|
||||
unsigned char* buffer = malloc(packetSize);
|
||||
memset(buffer, 0, packetSize);
|
||||
unsigned char* sb = buffer;
|
||||
memcpy(buffer, &p->packetTpye, sizeof(int));
|
||||
memcpy(buffer + sizeof(int), &p->size, sizeof(int));
|
||||
memcpy(buffer + sizeof(int) + sizeof(int), p->packet, p->size);
|
||||
|
||||
printf("buffer :");
|
||||
for(int i = 0; i < PACKET_SIZE(p); i++) {
|
||||
printf("%u", sb[i]);
|
||||
}
|
||||
|
||||
int r = send(fd,sb, PACKET_SIZE(p),0);
|
||||
|
||||
printf("\n");
|
||||
|
||||
free(sb);
|
||||
FreePacket(p);
|
||||
|
||||
if(r == -1) {
|
||||
printf("NG\n");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
int SendUserTransaction(user_transaction* tract, int fd) {
|
||||
packet* p = CreateUserTransaction(tract);
|
||||
|
||||
int packetSize = PACKET_SIZE(p);
|
||||
unsigned char* buffer = malloc(packetSize);
|
||||
memset(buffer, 0, packetSize);
|
||||
unsigned char* sb = buffer;
|
||||
memcpy(buffer, &p->packetTpye, sizeof(int));
|
||||
memcpy(buffer + sizeof(int), &p->size, sizeof(int));
|
||||
memcpy(buffer + sizeof(int) + sizeof(int), p->packet, p->size);
|
||||
|
||||
printf("buffer :");
|
||||
for(int i = 0; i < PACKET_SIZE(p); i++) {
|
||||
printf("%u", sb[i]);
|
||||
}
|
||||
|
||||
int r = send(fd,sb, PACKET_SIZE(p),0);
|
||||
|
||||
printf("\n");
|
||||
|
||||
free(sb);
|
||||
FreePacket(p);
|
||||
|
||||
if(r == -1) {
|
||||
printf("NG\n");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int RecvServerTransaction(server_transaction *tract, int fd) {
|
||||
|
||||
|
||||
packet tp;
|
||||
int sizeOfPacket = 1024;
|
||||
unsigned char* buffer = malloc(1024);
|
||||
int r = 0;
|
||||
|
||||
printf("reading buffer");
|
||||
r = recv(fd, buffer, sizeof(int)*2,0);
|
||||
printf("%d\n",r);
|
||||
|
||||
if(r > 0) {
|
||||
printf("buffer :");
|
||||
for(int i = 0; i < r; i++) {
|
||||
printf("%u", buffer[i]);
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
tp.packetTpye = (int)buffer[0];
|
||||
tp.size = (int)buffer[sizeof(int)];
|
||||
r = recv(fd, buffer, tp.size,MSG_DONTWAIT);
|
||||
tp.packet = malloc(tp.size);
|
||||
memcpy(tp.packet, buffer, tp.size);
|
||||
|
||||
memset(tract, 0, sizeof(server_transaction));
|
||||
memcpy(&tract->id, tp.packet, sizeof(int));
|
||||
memcpy(&tract->action, tp.packet + sizeof(int), sizeof(int));
|
||||
memcpy(&tract->argsize, tp.packet + sizeof(int) + sizeof(int), sizeof(int));
|
||||
tract->serverArg = malloc(tract->argsize);
|
||||
|
||||
memcpy(tract->serverArg, &tp.packet[sizeof(int)*3], tract->argsize);
|
||||
if(tract->id != 0) {
|
||||
printf("id: %d, action %d, argsize %d\n", tract->id, tract->action, tract->argsize);
|
||||
printf("Data :%s\n", (char*)tract->serverArg);
|
||||
}
|
||||
FreePacket(&tp);
|
||||
return 0;
|
||||
}
|
||||
free(buffer);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int RecvUserTransaction(user_transaction *tract, int fd) {
|
||||
|
||||
packet tp;
|
||||
int sizeOfPacket = 1024;
|
||||
unsigned char* buffer = malloc(1024);
|
||||
int r = 0;
|
||||
|
||||
printf("reading buffer");
|
||||
r = recv(fd, buffer, sizeof(int)*2,MSG_DONTWAIT);
|
||||
printf("%d\n",r);
|
||||
|
||||
if(r > 0) {
|
||||
printf("buffer :");
|
||||
for(int i = 0; i < r; i++) {
|
||||
printf("%u", buffer[i]);
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
tp.packetTpye = (int)buffer[0];
|
||||
tp.size = (int)buffer[sizeof(int)];
|
||||
r = recv(fd, buffer, tp.size,MSG_DONTWAIT);
|
||||
tp.packet = malloc(tp.size);
|
||||
memcpy(tp.packet, buffer, tp.size);
|
||||
|
||||
memset(tract, 0, sizeof(server_transaction));
|
||||
memcpy(&tract->id, tp.packet, sizeof(int));
|
||||
memcpy(&tract->action, tp.packet + sizeof(int), sizeof(int));
|
||||
memcpy(&tract->argsize, tp.packet + sizeof(int) + sizeof(int), sizeof(int));
|
||||
tract->userArg = malloc(tract->argsize);
|
||||
|
||||
memcpy(tract->userArg, &tp.packet[sizeof(int)*3], tract->argsize);
|
||||
if(tract->id != 0) {
|
||||
printf("id: %d, action %d, argsize %d\n", tract->id, tract->action, tract->argsize);
|
||||
printf("Data :%s\n", (char*)tract->userArg);
|
||||
}
|
||||
FreePacket(&tp);
|
||||
return 0;
|
||||
}
|
||||
free(buffer);
|
||||
return 1;
|
||||
|
||||
|
||||
}
|
||||
|
||||
void FreeUserTransaction(user_transaction* ut) {
|
||||
free(ut->userArg);
|
||||
memset(ut, 0, sizeof(user_transaction));
|
||||
}
|
||||
void FreeServerTransaction(server_transaction* st) {
|
||||
free(st->serverArg);
|
||||
memset(st, 0, sizeof(server_transaction));
|
||||
}
|
||||
|
||||
@@ -9,12 +9,14 @@
|
||||
* =============================================================================
|
||||
* */
|
||||
#ifndef TRANSACTIONS_H
|
||||
#define TRANSACTIONS_H
|
||||
|
||||
#define ENTITY_ACTION_MOVE_UP 1
|
||||
#define ENTITY_ACTION_MOVE_DOWN 2
|
||||
#define ENTITY_ACTION_MOVE_LEFT 3
|
||||
#define ENTITY_ACTION_MOVE_RIGHT 4
|
||||
#define ENTITY_ACTION_MOVE 1
|
||||
|
||||
#define SERVER_PACKET 1
|
||||
#define USER_PACKET 2
|
||||
#define RELAY_PACKET 3
|
||||
#define ADMIN_PACKET 4
|
||||
|
||||
typedef struct {
|
||||
int packetTpye, size;
|
||||
@@ -24,13 +26,49 @@ typedef struct {
|
||||
typedef struct {
|
||||
int id;
|
||||
int action;
|
||||
int userId;
|
||||
int entityId;
|
||||
int argsize;
|
||||
void* userArg;
|
||||
}action;
|
||||
}user_transaction;
|
||||
|
||||
int CreateTransaction(action* act);
|
||||
int GetTransaction(action* act);
|
||||
int ProssesTransaction(action* act);
|
||||
#define SERVER_T_CONNECT 0b0001
|
||||
#define SERVER_T_DISCONNECT 0b0010
|
||||
#define SERVER_T_RECONNECT 0b0011
|
||||
#define SERVER_T_RELAY 0b0100
|
||||
#define SERVER_T_KICK 0b0101
|
||||
#define SERVER_T_REQUEST 0b0110
|
||||
|
||||
#define SERVER_T_USER_FLAG 0b00010000
|
||||
#define SERVER_T_ADMIN_FLAG 0b00100000
|
||||
#define SERVER_T_SERVER_FLAG 0b01000000
|
||||
#define SERVER_T_RELAY_FLAG 0b10000000
|
||||
|
||||
#define SERVER_T_GET_PLAYER_DATA 1
|
||||
#define SERVER_T_SET_PLAYER_ID 2
|
||||
|
||||
|
||||
typedef struct {
|
||||
int id;
|
||||
int action;
|
||||
int userId;
|
||||
unsigned int ipaddress;
|
||||
int argsize;
|
||||
void* serverArg;
|
||||
|
||||
}server_transaction;
|
||||
|
||||
int GetTransaction(user_transaction* tract);
|
||||
int ProssesTransaction(user_transaction* tract);
|
||||
|
||||
int SendServerTransaction(server_transaction* tract, int serverFD);
|
||||
int SendUserTransaction(user_transaction* tract, int serverFD);
|
||||
|
||||
int RecvServerTransaction(server_transaction* tract, int serverFD);
|
||||
int RecvUserTransaction(user_transaction* tract, int serverFD);
|
||||
|
||||
void FreeUserTransaction(user_transaction* ut);
|
||||
void FreeServerTransaction(server_transaction* st);
|
||||
|
||||
#define TRANSACTIONS_H
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user