Проблема в аутентификации с использованием сокетов C в Linux - PullRequest
0 голосов
/ 16 декабря 2018

Может ли кто-нибудь помочь мне решить проблему аутентификации мини-чата с использованием Linux с языком C (сокеты)?

Когда я выбрал номер 1, он ничего не дает!В моей голове все логично, но кто знает!Для петли IP-адреса 127.0.0.1 и порта 5000 приведен код:

. / Server

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>
#include <ctype.h>


void error(const char *msg){
    perror(msg);
    exit(1);
}

int main(int argc, char *argv[]){
     int sockfd, newsockfd, portno;
     socklen_t clilen;
     char buffer[255];
     struct sockaddr_in serv_addr, cli_addr;
     int n;
    printf("Waiting on connections...."); 
     if (argc < 2) {
         fprintf(stderr,"ERROR, no port provided\n");
         exit(1);
     }
     sockfd = socket(AF_INET, SOCK_STREAM, 0);
     if (sockfd < 0) 
        error("ERROR opening socket");
     bzero((char *) &serv_addr, sizeof(serv_addr));
     portno = atoi(argv[1]);
     serv_addr.sin_family = AF_INET;
     serv_addr.sin_addr.s_addr = INADDR_ANY;
     serv_addr.sin_port = htons(portno);
     if (bind(sockfd, (struct sockaddr *) &serv_addr,
              sizeof(serv_addr)) < 0) 
              error("ERROR on binding");
     listen(sockfd,5);
     clilen = sizeof(cli_addr);
     newsockfd = accept(sockfd, 
                 (struct sockaddr *) &cli_addr, 
                 &clilen);
     if (newsockfd < 0) 
          error("ERROR on accept");


     int choice;
    const char logins[2][10] = {"hafsa","kaoutar"};
    const char pass[2][10] = {"hafsa","kaoutar"};     

   S:  n = write(newsockfd,"Enter your choice : \n1.Chat\n2.Send file\n3.Receive file\n4.Exit\n",strlen("Enter your choice : \n1.Chat\n2.Send file\n3.Receive file\n4.Exit\n"));         //Ask for choice    
     if (n < 0) error("ERROR writing to socket");
     read(newsockfd, &choice, sizeof(int));                 //Read choice
     printf("Client - Choice is : %d\n" , choice);  


      switch(choice){
        case 1:
        printf("Connexion\n");
        printf("Entrez le login :\n");
            bzero(buffer,256);
            n = read(newsockfd,buffer,255);
            if (n < 0) error("ERROR reading from socket");

        if(strncmp(*logins+0, buffer, 10) == 0){
            printf("Entrez le mot de passe :\n");
            bzero(buffer,256);
                n = read(newsockfd,buffer,255);
                if (n < 0) error("ERROR reading from socket");
            if(strncmp(*pass+0, buffer, 10) == 0){
                printf("Connexion avec succes !\n");
                while(1){
                    bzero(buffer,256);
                    n = read(newsockfd,buffer,255);
                    if (n < 0) error("ERROR reading from socket");
                    printf("%s: %s\n",logins[0],buffer);
                    bzero(buffer,256);
                    fgets(buffer,255,stdin);
                    n = write(newsockfd,buffer,strlen(buffer));
                    if (n < 0) error("ERROR writing to socket");
                    int i=strncmp("Bye" , buffer, 3);
                    if(i == 0)
                        break;
                }
            }
        }

        else if(strncmp(*logins+1, buffer, 10) == 0){
            printf("Entrez le mot de passe :\n");
            bzero(buffer,256);
                n = read(newsockfd,buffer,255);
                if (n < 0) error("ERROR reading from socket");

            if(strncmp(*pass+1, buffer, 10) == 0){
                printf("Connexion avec succes !\n");
                while(1){
                    bzero(buffer,256);
                    n = read(newsockfd,buffer,255);
                    if (n < 0) error("ERROR reading from socket");
                    printf("%s: %s\n",logins[1],buffer);
                    bzero(buffer,256);
                    fgets(buffer,255,stdin);
                    n = write(newsockfd,buffer,strlen(buffer));
                    if (n < 0) error("ERROR writing to socket");
                    int i=strncmp("Bye" , buffer, 3);
                    if(i == 0)
                        break;
                }
            }
        }

        else    error("Utilisateur inconnu !");

            break;
        case 2:
            printf("Mazal mazal mafqedt l2amaaal\n");
            break;
        case 3:
            printf("Mazal mazal mafqedt l2amaaal\n");
            break;
        case 4 :
        goto Q;
            break;
     }

     if(choice != 4)
        goto S;

   Q:  close(newsockfd);
     close(sockfd);
     return 0; 
}

. / Client

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h> 
#include<ctype.h>

void error(const char *msg)
{
    perror(msg);
    exit(0);
}

int main(int argc, char *argv[])
{
    int sockfd, portno, n;
    struct sockaddr_in serv_addr;
    struct hostent *server;

    char buffer[255];
    if (argc < 3)
    {
       fprintf(stderr,"usage %s hostname port\n", argv[0]);
       exit(0);
    }
    portno = atoi(argv[2]);
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) 
        error("ERROR opening socket");
    server = gethostbyname(argv[1]);
    if (server == NULL) {
        fprintf(stderr,"ERROR, no such host\n");
        exit(0);
    }
    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, 
         (char *)&serv_addr.sin_addr.s_addr,
         server->h_length);
    serv_addr.sin_port = htons(portno);
    if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
        error("ERROR connecting");


    int choice;
    const char logins[2][10] = {"hafsa","kaoutar"};
    const char pass[2][10] = {"hafsa","kaoutar"}; 

S:  bzero(buffer,256);                      
    n = read(sockfd,buffer,255);                //Read Server String Asking For The Choice
    if (n < 0) 
         error("ERROR reading from socket");
    printf("Server - %s\n",buffer);
    scanf("%d" , &choice);                      //Enter choice
    write(sockfd, &choice, sizeof(int));                //Send choice to Server

    if (choice == 4)
    goto Q;

    switch(choice){
        case 1 :
            printf("Connexion\n");
            printf("Entrez le login :\n");
            bzero(buffer,256);
            fgets(buffer,255,stdin);
            n = write(sockfd,buffer,strlen(buffer));
            if (n < 0) 
                 error("ERROR writing to socket");

            if(strncmp(*logins+0, buffer, 10) == 0){
                printf("Entrez le mot de passe :\n");
                bzero(buffer,256);
                    fgets(buffer,255,stdin);
                n = write(sockfd,buffer,strlen(buffer));
                    if (n < 0) error("ERROR writing to socket");

                if(strncmp(*pass+0, buffer, 10) == 0){
                    printf("Connexion avec succes !\n");
                    while(1){
                        bzero(buffer,256);
                        fgets(buffer,255,stdin);
                        n = write(sockfd,buffer,strlen(buffer));
                        if (n < 0) error("ERROR writing to socket");
                            printf("%s: %s\n",*logins+0,buffer);
                            bzero(buffer,256);
                        n = read(sockfd,buffer,255);
                            if (n < 0) error("ERROR reading from socket");
                        int i=strncmp("Bye" , buffer, 3);
                        if(i == 0)
                            break;
                    }       
                }
            }

            if(strncmp(*logins+1, buffer, 10) == 0){
                printf("Entrez le mot de passe :\n");
                bzero(buffer,256);
                    fgets(buffer,255,stdin);
                n = write(sockfd,buffer,strlen(buffer));
                    if (n < 0) error("ERROR writing to socket");

                if(strncmp(*pass+1, buffer, 10) == 0){
                    printf("Connexion avec succes !\n");
                    while(1){
                        bzero(buffer,256);
                        fgets(buffer,255,stdin);
                        n = write(sockfd,buffer,strlen(buffer));
                        if (n < 0) error("ERROR writing to socket");
                        printf("%s: %s\n",*logins+1,buffer);
                            bzero(buffer,256);
                        n = read(sockfd,buffer,255);
                            if (n < 0) error("ERROR reading from socket");
                            int i=strncmp("Bye" , buffer, 3);
                            if(i == 0)
                                break;
                        }
                }
            }

            else    error("Utilisateur inconnu !");

            break;
        case 2:
            printf("Mazal mazal mafqedt l2amaaal\n");
            break;
        case 3:
            printf("Mazal mazal mafqedt l2amaaal\n");
            break;
        case 4 :
        goto Q;
            break;

    }

    if(choice != 4)
        goto S;

Q:  printf("You chose to exit. See you later !.");



    close(sockfd);
    return 0;
}

1 Ответ

0 голосов
/ 16 декабря 2018

Проблема заключается в следующем коде в вашем клиенте:

scanf("%d" , &choice);

Именно здесь вы вводите свой «выбор» ... однако, к сожалению, вы ввели ОБА свой выбор «1», а затемсимвол новой строки ... но scanf () удалил только из стандартного ввода "1".новая строка все еще присутствует.Поэтому, когда клиент позже выполняет fgets () для получения информации для входа в систему, он получает только символ новой строки.

Я предлагаю заменить scanf () на fgets () и sscanf ().
Таким образом, fgets извлечет все пользовательские данные вплоть до новой строки, включая sscanf (), и может обработать буфер, который читает fgets ().Например:

    fgets(buffer,255,stdin);
    sscanf(buffer, "%d" , &choice);                
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...