added shooting mechanism on server

This commit is contained in:
Michal Starski 2018-11-20 14:41:42 +01:00
parent fe503f9283
commit 34938eed49
3 changed files with 78 additions and 62 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
server

BIN
server

Binary file not shown.

View File

@ -1,6 +1,3 @@
#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>
@ -11,21 +8,25 @@
#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;
char shoot;
} 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;
@ -53,29 +54,32 @@ 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;
} }
addrLen = sizeof(struct sockaddr_in); addrLen = sizeof(struct sockaddr_in);
int flag = 2; int flag = 2;
@ -84,17 +88,20 @@ int main( void ) {
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));
@ -110,20 +117,25 @@ int main( void ) {
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;
} }
@ -136,7 +148,8 @@ int main( void ) {
return 0; return 0;
} }
void* dataProcessHandler( void * data ) { void *dataProcessHandler(void *data)
{
TData *info = (TData *)data; TData *info = (TData *)data;
@ -149,14 +162,16 @@ void* dataProcessHandler( void * data ) {
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; {
sendto( info->socket, &floats, 12, 0, (struct sockaddr*)&info->address, sizeof(info->address)); if (recvfrom(info->socket, &floats, 13, 0, (struct sockaddr *)&tmp, &addrLen) != 13)
continue;
sendto(info->socket, &floats, 13, 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);
} }