Связь между TCP-сервером и клиентом в C

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

Сервер

            char username[50],parola[50];
            bzero(username,50);

            strcpy(mTrimis,"Enter message");
            //this is working fine
            if(write(client,mTrimis,sizeof(mTrimis))<=0)
            {
                perror ("[server]Error1\n");
                continue;
            }
            //this is working fine
            if(read(client,username,sizeof(username))<=0)
            {
                perror("[server]Error1r\n");
                continue;
            }
            bzero(parola,50);
            bzero(mTrimis,500);
            strcpy(mTrimis,"Enter password");
            //this is working fine
            if(write(client,mTrimis,sizeof(mTrimis))<=0)
            {
                perror ("[server]Error2\n");
                continue;
            }
            //this "read" is not working
            if(read(client,parola,sizeof(parola))<=0)
            {
                perror("[server]Error2\n");
                continue;
            }
            bzero(mTrimis,500);
            printf("%s-%s\n",username,parola);

Клиент

    bzero(mTrimis,500);
    bzero(mPrimit,500);
    if(read(sd,mPrimit,sizeof(mPrimit))<0)
    {
        perror ("[client]Error1 client)\n");
        return errno;
    }
    printf ("MESSAGE SERVER:\n%s\n",mPrimit);
    if(read(0,mTrimis,sizeof(mTrimis))<0)
    {
        perror ("[client]error client-keyboard\n");
        return errno;
    }
    if(write(sd,mTrimis,sizeof(mTrimis))<0) 
    {
        perror ("[client]Error1 client->server\n");
        return errno;
    }
    bzero(mTrimis,500);
    bzero(mPrimit,500);
    if(read(sd,mPrimit,sizeof(mPrimit))<0)
    {
        perror ("[client]Error2 cleint\n");
        return errno;
    }
    printf ("MESSAGE SERVER:\n%s\n",mPrimit);
    if(read(0,mTrimis,sizeof(mTrimis))<0)
    {
        perror ("[client] error2 client keyboard\n");
        return errno;
    }
    if(write(sd,mTrimis,sizeof(mTrimis))<0) 
    {
        perror ("[client]Error2 client->server\n");
        return errno;
    }

Итак, сервер запрашивает у клиента имя пользователя и получает его. Потом запрашивает пароль и тут (при втором "прочтении") не работает нормально. Он просто пропускает это «чтение», напечатает что-то вроде этого «user123-» и отключит клиента, потому что он достиг конца кода.

На стороне клиента он получает сообщение с запросом имени пользователя с сервера, затем клиент отправляет свое сообщение на сервер. Затем он получает второе сообщение с сервера, запрашивающее пароль, и не может отправить второе сообщение обратно на сервер, я получаю ошибку «error2 client-> server» (потому что он был отключен).


person Lerul Ler    schedule 26.12.2015    source источник
comment
Вы уверены, что клиент отправил пароль правильно?   -  person SACHIN GOYAL    schedule 26.12.2015
comment
Вы уверены, что с клиентом все в порядке? Пробовали ли вы удалить условие из read(client,parola,sizeof(parola))‹=0 и всегда печатать значение parola, просто для отладки и просмотра того, что на самом деле получают?   -  person EkcenierK    schedule 26.12.2015
comment
@SACHINGOYAL дайте мне секунду, чтобы отредактировать и добавить некоторые детали (клиент никогда не сможет отправить сообщение)   -  person Lerul Ler    schedule 26.12.2015
comment
@KLibby после кода строки печати я получаю что-то вроде этого user-; И я пробовал без этого условия, та же проблема.   -  person Lerul Ler    schedule 26.12.2015


Ответы (1)


Проверьте размер буферов на стороне клиента, используемых для отправки данных, на размер буферов на стороне сервера для получения данных. Подсказка там.

Клиент:

if(write(sd,mTrimis,sizeof(mTrimis))<0)

Используется для записи имени пользователя в первом write. Вы пишете не менее 500 байтов, идущих bzero(mTrimis,500);

Итак, на сокет выходит 500 байт.

Сервер:

Сколько читается при получении имени пользователя?

if(read(client,username,sizeof(username))<=0)

Всего 50 прошло char username[50]

Следовательно, сервер не читает все байты, отправленные клиентом.

В следующий раз, когда вы вызываете read на сервере, вы читаете оставшиеся 500 байтов - на этот раз тоже только 50 - которые все нули. Отсюда и поведение, которое вы видите.

Решение:

Когда вы читаете со стандартного ввода, вместо использования sizeof буфера в write используйте фактическое количество байтов, введенных пользователем.

n = read(0,mTrimis,sizeof(mTrimis));

if(write(sockfd,mTrimis,n)<0)

person Prabhu    schedule 26.12.2015