Ошибка сегментации — отправка объекта через сервер клиенту

Я пытаюсь создать клиент-серверное приложение в Linux. Сервер отправляет объект клиенту, но клиент записывает ошибку сегментации. Вот код
Змея — это класс, где двумерный массив.

Клиент отправляет сообщение «p» и сервер создает объект, который будет отправлен клиенту.

Сторона сервера:

  int main(int argc, char *argv[])
{

int sockfd, newsockfd;
socklen_t cli_len;
struct sockaddr_in serv_addr, cli_addr;
int n;
char buffer[256];if (argc < 2)
{
fprintf(stderr,"usage %s port\n", argv[0]);
return 1;
}

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(atoi(argv[1]));

sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
perror("Error creating socket");
return 1;
}

if (bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0)
{
perror("Error binding socket address");
return 2;
}
while(sockfd){
listen(sockfd, 5);
cli_len = sizeof(cli_addr);

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

if (newsockfd < 0)
{
perror("ERROR on accept");
return 3;
}

bzero(buffer,256);
n = read(newsockfd, buffer, 255);
if (n < 0)
{
perror("Error reading from socket");
return 4;
}// if client send 'p'
if(*buffer == 'p'   ){
Snake *snake = new Snake();

send(newsockfd,reinterpret_cast<const char*>(&snake), sizeof(snake),0);
}
}//printf("Here is the message: %s\n", buffer);

const char* msg = "I got your message";
n = write(newsockfd, msg, strlen(msg)+1);
if (n < 0)
{
perror("Error writing to socket");
return 5;
}

close(newsockfd);

close(sockfd);

}

Сторона клиента:

 int main(int argc, char *argv[])
{
int sockfd = 0,newsockfd, n;
struct sockaddr_in serv_addr;
struct hostent* server;
socklen_t cli_len, serv_len;

char buffer[999999];
struct sockaddr_in cli_addr;

if (argc < 3)
{
fprintf(stderr,"usage %s hostname port\n", argv[0]);
return 1;
}

server = gethostbyname(argv[1]);
if (server == NULL)
{
fprintf(stderr, "Error, no such host\n");
return 2;
}

bzero((char*)&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy(
(char*)server->h_addr,
(char*)&serv_addr.sin_addr.s_addr,
server->h_length
);
serv_addr.sin_port = htons(atoi(argv[2]));
//while(sockfd >= 0){
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
perror("Error creating socket");
return 3;
}

if(connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0)
{
perror("Error connecting to socket");
return 4;
}

printf("Please enter a message: ");
bzero(buffer,256);
fgets(buffer, 255, stdin);

n = write(sockfd, buffer, strlen(buffer));

if (n < 0)
{
perror("Error writing to socket");
return 5;
}

Snake *snake ;

recv(sockfd,reinterpret_cast<char*>(&snake), sizeof(snake),0);

if (n < 0)
{
perror("Error reading from socket");
return 6;
}

printf("%s\n",buffer);

close(sockfd);
close(newsockfd);
return 0;
}

Спасибо за ответ.

2

Решение

На стороне клиента

 Snake *snake ;

recv(sockfd,reinterpret_cast<char*>(&snake), sizeof(snake),0);

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

Также, sizeof(snake) это размер указателя (например, 4 байта), а не размер объекта, на который указывает. Это происходит как на сервере, так и на клиенте.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]