Клиент отправляет сообщение, но Сервер не получает сообщение, пока клиент не завершит программу - PullRequest
0 голосов
/ 11 июня 2018
    do{

        /// send msgs
        cout << "Client: ";
        cin.getline(clientMSG, 1024, '\n');

        if(strcmp(clientMSG, "quit") == 0){

            StringSource msgEncryptor(clientMSG, true, new StreamTransformationFilter(encrypt, new StringSink(encryptMSG)));
            StringSource encryptEncode(encryptMSG, true, new HexEncoder(new StringSink(encodeMSG)));

            memset(clientSEND, '\0', 3000);
            copy(encodeMSG.begin(), encodeMSG.end(), clientSEND);

            send(sock, clientSEND, strlen(clientSEND), 0);

            break;
        }

        StringSource msgEncryptor(clientMSG, true, new StreamTransformationFilter(encrypt, new StringSink(encryptMSG)));
        StringSource encryptEncode(encryptMSG, true, new HexEncoder(new StringSink(encodeMSG)));

        memset(clientSEND, '\0', 3000);
        copy(encodeMSG.begin(), encodeMSG.end(), clientSEND);

        send(sock, clientSEND, strlen(clientSEND), 0);

        /** ------------------------------------------------ **/

        /// receive msgs
        memset(clientRECV, '\0', 3000);
        valread = read(sock, clientRECV, 3000);

        StringSource encryptDecode(clientRECV, true, new HexDecoder(new StringSink(decodeMSG)));
        StringSource msgDecryptor(decodeMSG, true, new StreamTransformationFilter(decrypt, new StringSink(decryptMSG)));

        cout << "Server: " << decryptMSG << endl;





    }while(1);

Выше находится клиентская программа

do{

        /// receive msgs

        memset(serverRECV, '\0', 3000);
        valread = read(new_socket, serverRECV, 3000);

        StringSource encryptDecode(serverRECV, true, new HexDecoder(new StringSink(decodeMSG)));
        StringSource msgDecryptor(decodeMSG, true, new StreamTransformationFilter(decrypt, new StringSink(decryptMSG)));

        if(decryptMSG == "quit"){
            cout << "Client disconnected!" << endl;
            break;
        }

        cout << "Client: " << decryptMSG << endl;

        /** ------------------------------------------------------------------------ **/

        /// send msgs

        cout << "Server: ";
        cin.getline(serverMSG, 1024, '\n');

        if(strcmp(serverMSG, "quit") == 0){
            StringSource msgEncryptor(serverMSG, true, new StreamTransformationFilter(encrypt, new StringSink(encryptMSG)));
            StringSource encryptEncode(encryptMSG, true, new HexEncoder(new StringSink(encodeMSG)));

            memset(serverSEND, '\0', 3000);
            copy(encodeMSG.begin(), encodeMSG.end(), serverSEND);

            send(new_socket, serverSEND, strlen(serverSEND), 0);

            break;
        }

        StringSource msgEncryptor(serverMSG, true, new StreamTransformationFilter(encrypt, new StringSink(encryptMSG)));
        StringSource encryptEncode(encryptMSG, true, new HexEncoder(new StringSink(encodeMSG)));

        memset(serverSEND, '\0', 3000);
        copy(encodeMSG.begin(), encodeMSG.end(), serverSEND);

        send(new_socket, serverSEND, strlen(serverSEND), 0);

        cin.clear();
        memset(serverMSG, '\0', 3000);
    }while(1);

, это сервер.

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

Программа должна начинаться с того, что клиент вводит сообщение, затем шифрует сообщение и отправляет его на сервер.Затем сервер расшифрует его и отобразит сообщение.Но я не понимаю, почему оно не отображает сообщение, только когда я заканчиваю программу, которое оно отображает ...

Использую ли я неправильный способ отправки / чтения?Я почти уверен, что это не проблема шифрования / дешифрования, потому что я вижу сообщение на стороне сервера, когда заканчиваю программу на стороне клиента.

1 Ответ

0 голосов
/ 11 июня 2018

Я предполагаю, что вы не настроили свой сокет как неблокирующий, но эта строка на стороне сервера:

valread = read(new_socket, serverRECV, 3000);

... пытается прочитать 3000 байтов из сокета.Функция read () блокирует текущий поток, пока все данные не будут прочитаны из дескриптора.Закрытие программы прерывает read (), а остальная часть кода выполняется в это время.

С вашим кодом убедитесь, что клиент отправляет 3000 байтов, если вы хотите, чтобы ваш сервер его обработал.

Если вы хотите выполнить неблокирующее чтение, вы должны установить свой сокет соответствующим образом:

int flags = fcntl(new_socket, F_GETFL, 0);
fcntl(new_socket, F_SETFL, flags | O_NONBLOCK);

Осторожно, подумал, что вам нужно будет проверить много возвращаемых значений для read (), исоздайте логику, в которой вы читаете из сокета, пока не получите правильное количество байтов.

...