Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <string.h>
- #include <arpa/inet.h>
- #include <sys/socket.h>
- #include <errno.h>
- #define PUERTO 6666
- #define MAX_USER 100
- #define MAX_PASS 300
- ssize_t read_n(int fd, void*datos, int n);
- ssize_t write_n(int fd, void*datos, int n);
- int main(int argc, char*argv[])
- {
- //Variables
- int sockfd, n_sd;
- int longitud;
- uint32_t longBE;
- char user[MAX_USER];
- char password[MAX_PASS];
- struct sockaddr_in server_addr, client_addr;
- socklen_t sin_size = sizeof(client_addr);
- //Preparamos la direccion de memoria
- memset((char*)&server_addr, 0, sizeof(server_addr));
- server_addr.sin_family = AF_INET;
- server_addr.sin_port = htons(PUERTO);
- server_addr.sin_addr.s_addr = INADDR_ANY;
- //Abrimos el socket
- if((sockfd=socket(PF_INET, SOCK_STREAM, 0))<0){
- perror("socket");
- exit(1);
- }
- //Vinculamos el puerto con el socket
- if(bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr))<0){
- perror("Bind");
- exit(1);
- }
- //Ponemos el servidor en modo escucha
- if(listen(sockfd,10)<0){
- perror("listen");
- exit(1);
- }
- while(1){
- printf("Esperando conexion...\n");
- //Hemos aceptado una peticion
- n_sd=accept(sockfd, (struct sockaddr*)&client_addr, &sin_size);
- //Abrimos claves.txt
- FILE * file = fopen("claves.txt", "r");
- //Recibimos longitud y cadena de usuario
- if(read_n(n_sd, &longBE, sizeof(longBE))!=sizeof(longBE)){
- perror("read longBE");
- close(n_sd);
- fclose(file);
- exit(1);
- }
- longitud = ntohl(longBE);
- if(read_n(n_sd, user, longitud)!=longitud){
- perror("read user");
- fclose(file);
- close(n_sd);
- exit(1);
- }
- user[longitud]= '\0';
- printf("User: %s\n", user);
- //Buscamos usuario y enviamos retorno
- char linea[500];
- int encontrado = -1;
- while(fgets(linea, 500-1, file)!=NULL){
- linea[strlen(linea)-1] = '\0';
- char*puntero = strstr(linea, "@");
- *puntero = '\0';
- char*usuario = linea;
- if(strcmp(user, usuario)==0){
- encontrado = 0;
- //Si esta usuario, recibimos longitud y pass
- longBE = htonl(encontrado);
- if(write_n(n_sd, &longBE, sizeof(longBE))!=sizeof(longBE)){
- perror("write no encontrado el user");
- fclose(file);
- close(n_sd);
- exit(1);
- }
- if(read_n(n_sd, &longBE, sizeof(longBE))!=sizeof(longBE)){
- perror("read long pass");
- fclose(file);
- close(n_sd);
- exit(1);
- }
- longitud=ntohl(longBE);
- if(read_n(n_sd, password, longitud)!=longitud){
- perror("read pass");
- fclose(file);
- close(n_sd);
- exit(1);
- }
- password[longitud]='\0';
- printf("Password: %s\n", password);
- //Buscamos la pass en la linea de coincidencia
- char*contrasena = puntero+1;
- int pass = -1;
- printf("Password: %s\n", contrasena);
- //Enviamos retorno
- if(strcmp(password,contrasena)==0){
- pass = 0;
- }
- longBE = htonl(pass);
- if(write_n(n_sd, &longBE, sizeof(longBE))!=sizeof(longBE)){
- perror("write ret pass");
- fclose(file);
- close(n_sd);
- exit(1);
- }
- break;
- }
- }//while(fgets);
- if(encontrado==-1){
- longBE = htonl(encontrado);
- if(write_n(n_sd, &longBE, sizeof(longBE))!=sizeof(longBE)){
- perror("write no encontrado el user");
- fclose(file);
- close(n_sd);
- exit(1);
- }
- }
- if(close(n_sd)<0){
- perror("close n_sd");
- fclose(file);
- exit(1);
- }
- if(fclose(file)<0){
- perror("close file");
- exit(1);
- }
- }//while(1)
- if(close(sockfd)<0){
- perror("close sd");
- exit(1);
- }
- }
- ssize_t read_n(int fd, void*datos, int n)
- {
- ssize_t totalLeidos = 0;
- ssize_t intentandoLeer = n;
- ssize_t leidos;
- do{
- errno = 0;
- leidos=read(fd, totalLeidos + datos, intentandoLeer);
- if(leidos>0){
- totalLeidos += leidos;
- intentandoLeer -= leidos;
- }
- }while(((totalLeidos <n)&&(leidos>0))||(errno==EINTR));
- if(leidos<0){
- return leidos;
- }else{
- return totalLeidos;
- }
- }
- ssize_t write_n(int fd, void*datos, int n)
- {
- ssize_t totalLeidos = 0;
- ssize_t intentandoLeer = n;
- ssize_t leidos;
- do{
- errno = 0;
- leidos=write(fd, totalLeidos + datos, intentandoLeer);
- if(leidos>0){
- totalLeidos += leidos;
- intentandoLeer -= leidos;
- }
- }while(((totalLeidos <n)&&(leidos>0))||(errno==EINTR));
- if(leidos<0){
- return leidos;
- }else{
- return totalLeidos;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement