Hard reset server

This commit is contained in:
Konrad Pierzyński 2018-11-20 14:10:40 +01:00
parent 4e09837eff
commit fe503f9283
2 changed files with 61 additions and 82 deletions

BIN
server

Binary file not shown.

143
server.c
View File

@ -1,3 +1,6 @@
#pragma GCC diagnostic ignored "-Wunused-but-set-variable"
#pragma GCC diagnostic ignored "-Wunused-variable"
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <netinet/in.h> #include <netinet/in.h>
@ -8,45 +11,38 @@
#include <pthread.h> #include <pthread.h>
#include <unistd.h> #include <unistd.h>
typedef struct typedef struct {
{
int socket; int socket;
struct sockaddr_in address; struct sockaddr_in address;
} TData; } TData;
typedef struct typedef struct {
{
float x; float x;
float y; float y;
float z; float z;
float rot_x;
float rot_y;
float rot_z;
float rot_w;
} TFloat; } TFloat;
void Error(int err); void Error( int err );
void *dataProcessHandler(void *data); void* dataProcessHandler( void * data );
int main(void) int main( void ) {
{
int e = 0; int e = 0;
int i = 0; int i = 0;
struct sockaddr_in myAddr; struct sockaddr_in myAddr;
int sockMain; int sockMain;
int port = 8080; int port = 8080;
socklen_t addrLen; socklen_t addrLen;
int sock[2]; int sock[2];
struct sockaddr_in myAddrForClients[2]; struct sockaddr_in myAddrForClients[2];
struct sockaddr_in clients[2]; struct sockaddr_in clients[2];
struct sockaddr_in tmp; struct sockaddr_in tmp;
myAddr.sin_family = AF_INET; myAddr.sin_family = AF_INET;
myAddr.sin_port = htons(port); myAddr.sin_port = htons(port);
myAddr.sin_addr.s_addr = INADDR_ANY; myAddr.sin_addr.s_addr = INADDR_ANY;
myAddrForClients[0].sin_family = AF_INET; myAddrForClients[0].sin_family = AF_INET;
myAddrForClients[1].sin_family = AF_INET; myAddrForClients[1].sin_family = AF_INET;
@ -57,60 +53,52 @@ int main(void)
myAddrForClients[0].sin_addr.s_addr = INADDR_ANY; myAddrForClients[0].sin_addr.s_addr = INADDR_ANY;
myAddrForClients[1].sin_addr.s_addr = INADDR_ANY; myAddrForClients[1].sin_addr.s_addr = INADDR_ANY;
for (i = 0; i < 2; i++) for( i = 0; i < 2; i ++ ) {
{ if( (sock[i] = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
if ((sock[i] = socket(AF_INET, SOCK_DGRAM, 0)) < 0) Error( e++ );
{
Error(e++);
return -1; return -1;
} }
while (bind(sock[i], (struct sockaddr *)&myAddrForClients[i], sizeof(struct sockaddr_in)) < 0) while( bind( sock[i], (struct sockaddr*)&myAddrForClients[i], sizeof( struct sockaddr_in) ) < 0 ) {
{
myAddrForClients[i].sin_port = htons(ntohs(myAddrForClients[i].sin_port) + 1); myAddrForClients[i].sin_port = htons(ntohs(myAddrForClients[i].sin_port) + 1);
} }
} }
if ((sockMain = socket(AF_INET, SOCK_DGRAM, 0)) < 0) if( (sockMain = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
{ Error( e++ );
Error(e++);
return -1; return -1;
} }
if (bind(sockMain, (struct sockaddr *)&myAddr, sizeof(struct sockaddr_in)) < 0) if( bind( sockMain, (struct sockaddr*)&myAddr, sizeof(struct sockaddr_in) ) < 0 ) {
{ Error( e++ );
Error(e++); return -1;
return -1; }
}
printf("Server running on port 8080\n");
addrLen = sizeof(struct sockaddr_in);
int flag = 2; addrLen = sizeof( struct sockaddr_in );
int recvLen, sendLen;
int flag = 2;
int recvLen, sendLen;
char buf[5]; char buf[5];
memset(buf, 0, sizeof(buf)); memset( buf, 0 , sizeof(buf));
while (flag) while( flag ) {
{ recvLen = recvfrom( sockMain, buf, 5, 0, (struct sockaddr*)&tmp, &addrLen );
recvLen = recvfrom(sockMain, buf, 5, 0, (struct sockaddr *)&tmp, &addrLen);
if (buf[0] != 'U' || buf[1] != 'N' || buf[2] != 'I' || buf[3] != 'T' || buf[4] != 'Y') if( buf[0] != 'U' || buf[1] != 'N' || buf[2] != 'I' || buf[3] != 'T' || buf[4] != 'Y' ) {
{ Error( e++ );
Error(e++);
return -1; return -1;
} }
clients[2 - flag--] = tmp; clients[2-flag--] = tmp;
} }
for (i = 0; i < (sizeof(myAddrForClients) / sizeof(myAddrForClients[0])); i++) for( i = 0; i < (sizeof(myAddrForClients) / sizeof(myAddrForClients[0])); i++ ) {
{
char port2char[8]; char port2char[8];
sprintf(port2char, "%d\r\n", ntohs(myAddrForClients[i].sin_port)); sprintf(port2char, "%d\r\n", ntohs(myAddrForClients[i].sin_port) );
sendLen = sendto(sockMain, port2char, sizeof(port2char), 0, (struct sockaddr *)&clients[i], sizeof(clients[i])); sendLen = sendto(sockMain, port2char, sizeof(port2char), 0, (struct sockaddr*)&clients[i], sizeof( clients[i]) );
} }
//Unity's got port number to connect //Unity's got port number to connect
@ -120,28 +108,23 @@ int main(void)
pthread_t handlers[2]; pthread_t handlers[2];
TData data[2]; TData data[2];
int size = (sizeof(handlers) / sizeof(handlers[0])); int size = ( sizeof(handlers) / sizeof(handlers[0]) );
for (i = 0; i < size; i++) for( i = 0; i < size; i++ ) {
{
data[i].socket = sock[i]; data[i].socket = sock[i];
data[i].address = clients[size - 1 - i]; data[i].address = clients[size-1-i];
} }
for (i = 0; i < size; i++) for( i = 0; i < size; i++ ) {
{ if( pthread_create(&handlers[i], NULL, dataProcessHandler, &data[i] ) ) {
if (pthread_create(&handlers[i], NULL, dataProcessHandler, &data[i])) Error( e++ );
{
Error(e++);
return -1; return -1;
} }
} }
for (i = 0; i < size; i++) for( i = 0; i < size; i++ ) {
{ if( pthread_join( handlers[i], NULL )) {
if (pthread_join(handlers[i], NULL)) Error( e++ );
{
Error(e++);
return -1; return -1;
} }
} }
@ -150,34 +133,30 @@ int main(void)
close(sock[0]); close(sock[0]);
close(sock[1]); close(sock[1]);
return 0; return 0;
} }
void *dataProcessHandler(void *data) void* dataProcessHandler( void * data ) {
{
TData *info = (TData *)data; TData *info = (TData*)data;
TFloat floats; TFloat floats;
memset(&floats, 0, sizeof(floats)); memset(&floats,0,sizeof(floats));
struct sockaddr_in tmp; struct sockaddr_in tmp;
socklen_t addrLen; socklen_t addrLen;
printf("HANDLER STARTED..\n"); printf("HANDLER STARTED..\n");
printf("LOOKING AT SOCKET: %d, ON PORT: %d\n", info->socket, ntohs(info->address.sin_port)); printf("LOOKING AT SOCKET: %d, ON PORT: %d\n", info->socket, ntohs(info->address.sin_port) );
while (1) while( 1 ) {
{ if( recvfrom( info->socket, &floats, 12, 0, (struct sockaddr*)&tmp, &addrLen) != 12 ) continue;
if (recvfrom(info->socket, &floats, 28, 0, (struct sockaddr *)&tmp, &addrLen) != 28) sendto( info->socket, &floats, 12, 0, (struct sockaddr*)&info->address, sizeof(info->address));
continue;
// printf("x: %f, y: %f, z: %f, rot_x: %f, rot_y: %f, rot_z: %f, rot_w: %f\n", floats.x, floats.y, floats.z, floats.rot_x, floats.rot_y, floats.rot_z, floats.rot_w);
sendto(info->socket, &floats, 28, 0, (struct sockaddr *)&info->address, sizeof(info->address));
} }
return NULL; return NULL;
} }
void Error(int err) void Error( int err ) {
{ printf("Error! Code: %d\n", err);
printf("Error! Code: %d\n", err);
} }