added shooting mechanism on server
This commit is contained in:
parent
fe503f9283
commit
34938eed49
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
server
|
69
server.c
69
server.c
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user