TCP-сервер сокета C не работает после отключения клиента - PullRequest
0 голосов
/ 11 мая 2019

Я изменяю код сервера отсюда http://www.linuxhowtos.org/C_C++/socket.htm. Я хочу сбросить сервер, когда клиент отключается, чтобы он был готов в следующий раз для клиента. Но вместо этого, когда я закрываю клиентскую часть, сервер выключается и ничего не записывается в журнал сервера. Поскольку я хочу работать только с одним клиентом за раз, мне не нужно разветвляться, верно? В противном случае сервер работает нормально и отвечает на сообщения, отправленные клиентом, написанным на C #.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>

FILE *fp;

double square(double x)
{
     return x*x;
}

void error(const char *msg)
{
     fprintf(fp, "%s", msg);
     fprintf(fp, "%s", "\n");
}

int main(int argc, char *argv[])
{
     fp = fopen("serverlog.txt", "a");

     int sockfd;
     int newsockfd;
     int portno = 43635;
     int clientIsConnected;

     socklen_t clilen;
     char buffer[256];

     struct sockaddr_in serv_addr, cli_addr;
     int n;

while (1)
{
     sockfd = socket(AF_INET, SOCK_STREAM, 0);

     if (sockfd < 0)
     { 
          error("ERROR opening socket");
          close(sockfd);
          return 0;
     }

     bzero((char *) &serv_addr, sizeof(serv_addr));

     serv_addr.sin_family = AF_INET;
     serv_addr.sin_addr.s_addr = INADDR_ANY;
     serv_addr.sin_port = htons(portno);

     if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) 
     {
          error("ERROR on binding");
          close(sockfd);
          return 0;
     }

     if (listen(sockfd,5) < 0)
     {
          error("ERROR on listen");
          close(sockfd);
          return 0;
     }

     clilen = sizeof(cli_addr);
     newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);

     if (newsockfd < 0) 
     {
          error("ERROR on accept");
          close(newsockfd);
          close(sockfd);
          return 0;
     }

     clientIsConnected = 1;

     while (clientIsConnected)
     {
          bzero(buffer, 256);
          n = read(newsockfd, buffer, 255);

          if (n < 0)
          {
               error("ERROR reading from socket");
               clientIsConnected = 0;
               break;
          }

          double x = atof(buffer);
          double squared = square(x); 
          char response[256];
          sprintf(response, "%f", squared);

          n = write(newsockfd, response, strlen(response));

          if (n < 0)
          { 
               error("ERROR writing to socket");
               clientIsConnected = 0;
               break;
          }
     }
}

     close(sockfd);
     return 0; 
}

1 Ответ

1 голос
/ 11 мая 2019

Возможно, ваш сервер останавливается, потому что он получил SIGPIPE.Вы можете использовать сигнал

(SIGPIPE, SIG_IGN);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...