Я запускаю серверное приложение в ОС Linux для получения сообщений от клиента, а затем на основании сообщения сервер должен отправить ответ клиенту.Это не однократный процесс, я постоянно запускаю сервер для прослушивания сообщений, а затем он должен отправить ответ обратно.
Проблема, с которой я сталкиваюсь, заключается в том, что при каждом отправлении сообщения с сервера неполучение следующего сообщения от клиента и затем со второй попытки его получения. Но затем на стороне клиента сообщение показывается как отправленное.Если я отключаю функцию отправки, сервер получает сообщения без каких-либо проблем.
Есть ли что-то, что я здесь делаю неправильно?
#include "server.h"
server::server(int port)
{
bufferLength = 1024;
buffer = new char[bufferLength+1];
portNo = port;
client = -1;
}
server::~server()
{
delete buffer;
}
void server::run() {
createSocket();
serve();
}
void server::createSocket(){
sockId = socket(AF_INET, SOCK_STREAM, 0);
cout << "socketId "<<sockId<<" port is "<<this->portNo<<endl;
if (!sockId) {
perror("socket");
exit(-1);
}
struct sockaddr_in serverAddress;
memset(&serverAddress,0,sizeof(serverAddress));
serverAddress.sin_family = AF_INET;
serverAddress.sin_port = htons(portNo);
serverAddress.sin_addr.s_addr = INADDR_ANY;
int reUse = 1;
if (setsockopt(sockId, SOL_SOCKET, SO_REUSEADDR, &reUse, sizeof(reUse)) < 0) {
perror("setsockopt");
exit(-1);
}
if (bind(sockId,(const struct sockaddr *)&serverAddress,sizeof(serverAddress)) < 0) {
perror("bind");
exit(-1);
}
if (listen(sockId,SOMAXCONN) < 0) {
perror("listen");
exit(-1);
}
}
void server::closeSocket(){
int status;
status = close(sockId);
if (!status) {
perror("socket");
exit(-1);
}
}
void server::serve() {
struct sockaddr_in clientAddress;
socklen_t clientLength = sizeof(clientAddress);
while ((client = accept(sockId,(struct sockaddr *)&clientAddress,&clientLength)) > 0) {
getMessage(client);
}
closeSocket();
}
void server::handle(int client) {
getMessage(client);
close(client);
}
void server::getMessage(int client) {
int result;
cout<<"receive client "<<client<<endl;
result = recv(client,buffer,1024,0);
if(result <= 0)
perror("receive function failed or finished");
cout <<"ROI "<<buffer<<endl;
char* output = NULL;
output = strstr(buffer,"end");
char* output3 = NULL;
output3 = strstr(buffer,"get");
if(output){
strncpy(output,"",3);
writeNewRoi();
cout<<"restarting "<<endl;
system("sudo ./restart_detection.sh");
}
if(output3){
sendRoi(client);
}
}
void server::writeNewRoi(){
ofstream outfile("ROI.txt");
outfile << buffer;
outfile.close();
}
void server::sendRoi(int client){
ifstream roiFile;
roiFile.open("ROI.txt");
string str;
while(!roiFile.eof()){
getline(roiFile,str);
str += "\n";
const char* message = str.c_str();
int nleft = str.length();
int nwritten;
while (nleft) {
nwritten = send(client, message, nleft, 0);
nleft -= nwritten;
message += nwritten;
}
}
roiFile.close();
char endMsg[] = "end";
send(client, endMsg, strlen(endMsg), 0);
}