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);