Сервер не получает от клиента. Linux TCP / IP связь - PullRequest
0 голосов
/ 10 марта 2019

Я запускаю серверное приложение в ОС 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);
}
...