C++ 客户端发送消息,但服务器在客户端结束程序之前不接收消息 do{ ///发送MSG cout

C++ 客户端发送消息,但服务器在客户端结束程序之前不接收消息 do{ ///发送MSG cout,c++,aes,crypto++,C++,Aes,Crypto++,我假设您没有将套接字设置为非阻塞,但是服务器端的那一行: do{ /// receive msgs memset(serverRECV, '\0', 3000); valread = read(new_socket, serverRECV, 3000); StringSource encryptDecode(serverRECV, true, new HexDecoder(new StringSink(decodeMSG)))

我假设您没有将套接字设置为非阻塞,但是服务器端的那一行:

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);
…正在尝试从套接字读取3000字节。read()函数将阻止当前线程,直到从描述符读取所有数据。关闭程序将中止read(),此时将执行其余代码

如果希望服务器处理代码,请确保客户端发送3000字节

如果希望执行非阻塞读取,则应相应地设置套接字:

valread = read(new_socket, serverRECV, 3000);

当心,我想,您需要检查read()的许多返回值,并创建一个逻辑,从套接字读取数据,直到收到正确的字节数。

您是否编写了一个未经加密的程序?缺少很多信息,如通信详细信息。您可能应该让客户端/服务器处理纯文本消息。一旦处理纯文本消息就可以了然后转到加密邮件。我想这就是Neil的建议。另请看。如果客户端和服务器在同一台机器上运行,那么签出一个。@adam chua这回答了你的问题吗?
valread = read(new_socket, serverRECV, 3000);
int flags = fcntl(new_socket, F_GETFL, 0);
fcntl(new_socket, F_SETFL, flags | O_NONBLOCK);