61 lines
1.6 KiB
C
61 lines
1.6 KiB
C
#include "game_client.h"
|
|
|
|
#include <netinet/in.h>
|
|
#include <arpa/inet.h>
|
|
#include <stdlib.h>
|
|
#include <string.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);
|
|
int blocking_mode = 1;
|
|
|
|
|
|
gs->socket = socket(AF_INET, SOCK_STREAM, 0);
|
|
inet_pton(AF_INET, gs->info.ip, &serverAddr.sin_addr);
|
|
|
|
if(connect(gs->socket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {
|
|
ioctl(gs->socket, FIONBIO, &blocking_mode); // Shuld be 1
|
|
|
|
return 0;
|
|
}
|
|
return -1;
|
|
}
|
|
int Client_Send(game_server* gs,packet* packet) {
|
|
int sendPacketSize = sizeof(int) + sizeof(int) + packet->size;
|
|
unsigned char* buffer = malloc(sizeof(int) + sizeof(int) + packet->size);
|
|
memcpy(buffer, &packet->packetTpye, sizeof(int));
|
|
memcpy(buffer+sizeof(int), &packet->size, sizeof(int));
|
|
memcpy(buffer+sizeof(int)+sizeof(int), &packet->packet, packet->size);
|
|
|
|
write(gs->socket, buffer, sendPacketSize);
|
|
return 0;
|
|
}
|
|
|
|
int Client_Recive(game_server* gs, packet* packet) {
|
|
|
|
if(read(gs->socket, &packet->packetTpye, sizeof(int)) <= 0) {
|
|
return 0;
|
|
}
|
|
if(read(gs->socket, &packet->size, sizeof(int)) <= 0 ) {
|
|
return -1;
|
|
}
|
|
|
|
packet->packet = malloc(packet->size);
|
|
|
|
if(read(gs->socket, &packet->packet, packet->size) <= 0) {
|
|
free(packet->packet);
|
|
return -1;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
int Disconnect(game_server* gs) {
|
|
close(gs->socket);
|
|
return 0;
|
|
}
|