-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathts.c
More file actions
executable file
·218 lines (181 loc) · 6.01 KB
/
ts.c
File metadata and controls
executable file
·218 lines (181 loc) · 6.01 KB
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
// No codeblocks inclua no menu em: Project -> Build Options... -> Linker settings -> Other link options -l wsock32
//#define WIN // Se não for no windows comente essa linha e compile no terminal: gcc -o ts ts.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#ifdef WIN
#include <winsock2.h>
#else
#include <sys/socket.h>
#include <arpa/inet.h>
#endif
#define TAM_MENSAGEM 6 /* mensagem de maior tamanho */
#define PORTA_SERVIDOR_TCP 9999
#define MAXPENDING 100 /* Número máximo de requisições para conexão pendentes */
#define ARQP "par.txt"
#define ARQI "impar.txt"
#define ARQS "7.txt"
int criar_socket(int porta)
{
int sock;
struct sockaddr_in endereco; /* Endereço Local */
/* Criação do socket TCP para recepção e envio de pacotes */
if ((sock = socket(PF_INET, SOCK_STREAM, 0)) < 0)
{
printf("\nErro na criação do socket!\n");fflush(stdout);
return(-1);
}
if (porta > 0)
{
/* Construção da estrutura de endereço local */
memset(&endereco, 0, sizeof(endereco)); /* Zerar a estrutura */
endereco.sin_family = AF_INET; /* Família de endereçamento da Internet */
endereco.sin_addr.s_addr = htonl(INADDR_ANY); /* Qualquer interface de entrada */
endereco.sin_port = htons(porta); /* Porta local */
/* Instanciar o endereco local */
if (bind(sock, (struct sockaddr *) &endereco, sizeof(endereco)) < 0)
{
printf("\nErro no bind()!\n");fflush(stdout);
return(-1);
}
/* Indica que o socket escutara as conexões */
if (listen(sock, MAXPENDING) < 0)
{
printf("\nErro no listen()!\n");fflush(stdout);
return(-1);
}
}
return(sock);
}
int aceitar_conexao(int sock)
{
int socket_cliente;
struct sockaddr_in endereco; /* Endereço Local */
int tamanho_endereco;
/* Define o tamanho do endereço de recepção e envio */
tamanho_endereco = sizeof(endereco);
/* Aguarda pela conexão de um cliente */
if ((socket_cliente = accept(sock, (struct sockaddr *) &endereco, &tamanho_endereco)) < 0)
{
printf("\nErro no accept()!\n");fflush(stdout);
return(0);
}
return(socket_cliente);
}
int receber_mensagem(char *mensagem,int sock)
{
/* Limpar o buffer da mensagem */
memset((void *) mensagem,0,TAM_MENSAGEM);
/* Espera pela recepção de alguma mensagem do cliente conectado*/
if (recv(sock, mensagem, TAM_MENSAGEM, 0) < 0)
{
printf("\nErro na recepção da mensagem\n");fflush(stdout);
return(-1);
}
printf("\nTCP Servidor: Recebi (%s)\n",mensagem);fflush(stdout);
return(0);
}
int enviar_mensagem(char *mensagem,int sock)
{
/* Devolve o conteúdo da mensagem para o cliente */
if (send(sock, mensagem, strlen(mensagem), 0) != strlen(mensagem))
{
printf("\nErro no envio da mensagem\n");fflush(stdout);
return(-1);
}
printf("\nTCP Servidor: Enviei (%s)\n",mensagem);fflush(stdout);
return(0);
}
int main()
{
int sock; /* Socket */
int socket_cliente; /* Socket de conexão com o cliente */
int resultado; /* Resultado das funções */
char mensagem[TAM_MENSAGEM]; /* Buffer para a recepção da string de echo */
FILE *arqI, *arqP, *arqS;
#ifdef WIN
WORD wPackedValues;
WSADATA SocketInfo;
int nLastError,
nVersionMinor = 1,
nVersionMajor = 1;
wPackedValues = (WORD)(((WORD)nVersionMinor)<< 8)|(WORD)nVersionMajor;
nLastError = WSAStartup(wPackedValues, &SocketInfo);
#endif
if ((arqP = fopen(ARQP,"wt"))==NULL)
{
printf("\n>> ERRO: criando o arquivo de saida (par.txt)\n");
return(1);
}
if ((arqI = fopen(ARQI,"wt"))==NULL)
{
printf("\n>> ERRO: criando o arquivo de saida (impar.txt)\n");
return(1);
}
if ((arqS = fopen(ARQS,"wt"))==NULL)
{
printf("\n>> ERRO: criando o arquivo de saida (7.txt)\n");
return(1);
}
sock = criar_socket(PORTA_SERVIDOR_TCP);
if (sock < 0)
{
printf("\nErro na criação do socket!\n");
return(1);
}
for (;;) /* Loop eterno */
{
/* Aguarda por uma conexão e a aceita criando o socket de contato com o cliente */
socket_cliente = aceitar_conexao(sock);
if (socket_cliente == 0)
{
printf("\nErro na conexao do socket!\n");
return(1);
}
/* Recebe a mensagem do cliente */
resultado = receber_mensagem(mensagem,socket_cliente);
if (resultado < 0)
{
printf("\nErro no recebimento da mensagem\n");
return(1);
}
if (mensagem[5]=='A')
{
fprintf(arqS,"%.5s\n",mensagem);
fprintf(arqP,"%.5s\n",mensagem);
}
else if (mensagem[5]=='B')
{
fprintf(arqP,"%.5s\n",mensagem);
}
else if (mensagem[5]=='C')
{
fprintf(arqS,"%.5s\n",mensagem);
fprintf(arqI,"%.5s\n",mensagem);
}
else if (mensagem[5]=='D')
fprintf(arqI,"%.5s\n",mensagem);
else
{
printf("\nErro : Mensagem Indefinida >> %s",mensagem);
mensagem[5]='U';
}
if (mensagem[5] != 'U') mensagem[5]='O';
/* Devolve o conteúdo da mensagem para o cliente */
resultado = enviar_mensagem(mensagem,socket_cliente);
if (resultado < 0)
{
printf("\nErro no envio da mensagem\n");
return(1);
}
fflush(arqP);
fflush(arqI);
fflush(arqS);
close(socket_cliente); /* Fecha o socket do cliente */
}
fclose(arqP);
fclose(arqI);
fclose(arqS);
/*não passa por aqui */
}