-
Notifications
You must be signed in to change notification settings - Fork 0
/
socket.c
executable file
·143 lines (124 loc) · 3.5 KB
/
socket.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/********************************************
Funciones de socket de Nk-Tron
*********************************************
Archivo: socket.c
Descripcion del archivo:
Ofrece funciones de comunicacion por socket.
Es incluido en el proceso cliente y en el proceso servidor.
*/
#define COLA 20 // cant de conexiones creo
#define MAX_JUGADORES 6 // cantidad maxima de jugadores
struct sockaddr_in serveraddr, clientaddr;
struct paketeSC
{ char cabecera;
// I = inicio (cantniv,nombre,nrojugador)
// N (ronda) = (cantniv, direcc[],x[],y[]) //cantniv es nro de ronda aca
// S = (direcc[],x[],y[]) // si alguien perdio lo indica con direcc=-1
// F = (ganador,puntajes[])
int cantniv, x[6], y[6], direcc[6];
char nombre[7][6];
int nrojugador;
int puntajes[6];
int ganador;
};
struct paketeCS
{ char cabecera;
// N = nombre
// S = direcc
char nombre[7];
int direcc;
};
int conectar (char* host,int puerto)
{
int fdsocket; //Descriptor del Socket
struct sockaddr_in serveraddr;
struct hostent *host_name;
if ((host_name = gethostbyname(host)) == 0) //gethostbyname --> convierte "localhost" a "127.0.0.1"
{
printf("gethostbyname()");//perror("gethostbyname()");
return -1;//exit(-1);
}
/*Se inicializa la estructura serveraddr */
/* sin_family ---> Familia de protocolos
sin_port -----> Numero de puerto del servidor
sin_addr -----> Direccion IP numerica del servidor
*/
bzero(&serveraddr, sizeof(serveraddr)); //Se limpia la estructura
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr.sin_addr.s_addr = ((struct in_addr *)(host_name->h_addr))->s_addr;
serveraddr.sin_port = htons(puerto);
fdsocket = socket(AF_INET, SOCK_STREAM, 0);
if(fdsocket == -1)
{
printf("socket()");//perror("socket()");
return -1;//return -1; //exit(-1);
}
if(connect(fdsocket, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) == -1)
{ //printf("ERRconnect()\n");
return -1; //exit(-1);
}
return fdsocket;
}
int enviar (int fdsocket,void *data,int tam)
{
if(send(fdsocket, data, tam,0) == -1)
{
printf("send()");
return -1;//return -1; //exit(-1);
}
return 0;
}
int recibir (int fdsocket,void *buffer,int tam)
{
if(recv(fdsocket, buffer, tam, MSG_WAITALL) == -1)
{
printf("recv()");
return -1;//return -1; //exit(-1);
}
return 0;
}
int desconectar (int fdsocket)
{
close(fdsocket);
}
// servidor
int escuchar (int puerto)
{
int fdlisten;
struct sockaddr_in serveraddr;
/* Crea un Socket TCP */
fdlisten = socket(AF_INET, SOCK_STREAM, 0);
if(fdlisten == -1)
{
printf("socket()");
return -1; //exit(-1);
}
bzero(&serveraddr, sizeof(serveraddr)); //Se limpia la estructura
serveraddr.sin_family = AF_INET; //AF_INET --> Selecciona la pila TCP
serveraddr.sin_addr.s_addr = INADDR_ANY; //INADDR_ANY --> permite IP de cualquier host
serveraddr.sin_port = htons(puerto); //htons() --> convierte el entero a orden de bytes de red
if(bind(fdlisten,(struct sockaddr *)&serveraddr, sizeof(serveraddr)) == -1)
{ printf("bind()");
return -1; //exit(-1);
}
if(listen(fdlisten,COLA) == -1)
{
printf("listen()");
return -1; //exit(-1);
}
return fdlisten;
}
int aceptar (int fdlisten)
{
//struct sockaddr_in clientaddr;
int fdcliente;
socklen_t sin_size=sizeof(struct sockaddr_in);
fdcliente = accept(fdlisten,(struct sockaddr *)&clientaddr, &sin_size);
if(fdcliente == -1)
{
printf ("accept()");//perror("accept()");
return -1;//exit(-1);
}
return fdcliente;
}