Сервер мгновенно пропускает поиск пин-кода - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь создать две программы, которые отправляют сообщения друг другу, используя сокеты, в соответствии с моделью сервер-клиент .

Клиент должен поставить пин-код (в данном случае " 1234 "), но сервер почему-то пропускает функцию search4pin(). Я попытался использовать atoi(), чтобы прочитать буфер переменных и сохранить его на булавке, но это ничего не изменило. Используя gdb, я увидел, что переменная не принимает значения. Спасибо за ваше время.

Сервер:

#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 <arpa/inet.h>
#include <sys/wait.h>
#define MAX_PINS 1

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

int search4pin(int pin,int pins[]){
     for(int i=0;i<MAX_PINS;i++){
          if(pin==pins[i])
               return 0;
     }
     return 1;
}

int main(int argc, char *argv[]){
    int sockfd, newsockfd, portno, pid;
    socklen_t clilen;
    char buffer[256];
    char* comm[20],*cbuff;
    struct sockaddr_in serv_addr, cli_addr;
    int n,i,done=0,pin,correct=0,pins[MAX_PINS]={1234};
    char str[INET_ADDRSTRLEN];
    char* args;

    if (argc < 2)
    {
        fprintf(stderr, "No port provided\n");
        exit(1);
    }
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
        error("ERROR opening socket");

    memset((char *) &serv_addr, 0, 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");
    if (inet_ntop(AF_INET, &cli_addr.sin_addr, str, INET_ADDRSTRLEN) == NULL) {
        fprintf(stderr, "Could not convert byte to address\n");
        exit(1);
    }
    fprintf(stdout, "The client address is :%s\n", str);
    bzero(buffer,256);
    n = read(newsockfd,buffer,255);
    if (n < 0) error("ERROR reading from socket");
        sscanf(buffer,"%d",&pin);
    while(!search4pin(pin,pins)){
        n = write(newsockfd, "Wrong pin!\n", 12);
        if (n < 0) error("ERROR writing to socket");
    }
    /*Some other 
   code*/

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

Клиент:

#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>
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[256];
    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");

    printf("What is the password?\n");
    n = write(sockfd, stdin, sizeof(int));
    if (n < 0)
        error("ERROR writing to socket");

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...