c++ - 段错误 - 通过服务器将对象发送到客户端

标签 c++ linux segmentation-fault tcpclient tcpserver

我正在尝试在 Linux 中创建一个客户端服务器应用程序。服务器向客户端发送对象,但客户端写入段错误。这是代码。 Snake 是类,其中 是二维数组。

客户端发送消息“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;
 }  

感谢您的回答。

最佳答案

在客户端

 Snake *snake ;

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

尝试读取 Snake,但您尚未创建任何 Snake。因此,未初始化的指针会导致段错误。

此外,sizeof(snake) 是指针的大小(如 4 个字节),而不是指向的对象的大小。这会发生在服务器和客户端中。

关于c++ - 段错误 - 通过服务器将对象发送到客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47631739/

相关文章:

C++ 字符串输入作为 if/else 语句条件

c++ - 为什么const对象的成员变量不是const

c++ - 显式调用析构函数的行为

regex - U-Boot版本提取对比

c - 在c中传递数组

c++ - boost asio 行为 - 从多个线程调用 ios_service::run

linux - crontab 在重新启动时不启动命令

linux - RootFS 类型、创建和引导

c - 读取文件时出现段错误

C 使用字符串和 SEGFAULT