简体   繁体   English

分段错误(核心转储)错误 C linux 套接字

[英]Segmentation fault (core dumped) error C linux sockets

Please help me this program should send files via sockets, but it shows the error segmentation fault when I run it.请帮助我这个程序应该通过套接字发送文件,但是当我运行它时它显示错误分段错误。 The server uses thread to implement multiple clients.服务器使用线程来实现多个客户端。 Thanks!谢谢! It's my final project!!这是我的最终项目!!

This is the server code:这是服务器代码:

#include<stdio.h>
#include<string.h>    
#include<stdlib.h>    
#include<sys/socket.h>
#include<arpa/inet.h> 
#include<unistd.h>    
#include<pthread.h> 
static const int BUFFER_SIZE = 1024;
//CREAR HILO
void *connection_handler(void *);

int main(int argc , char *argv[])
{
    int socket_desc , client_sock , c , *new_sock;
    struct sockaddr_in server , client;


    //CREAR SOCKET
    socket_desc = socket(AF_INET , SOCK_STREAM , 0);
    if (socket_desc == -1) //ERROR AL CREAR EL SOCKET
    {
    printf("ERROR AL CREAR EL SOCKET");
    }
    puts("SOCKET CREADO"); //SOCKET CREADO

    //VALORES DEL SOCKET
    server.sin_family = AF_INET; //SOCKET IP
    server.sin_addr.s_addr = INADDR_ANY; // EJECUTAR CON LA IP DE LA MAQUINA ACTUAL
    server.sin_port = htons(9999);//PUERTO

    //ASOCIAR SOCKET A UN PUERTO
    if( bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0)
    {
    // ERROR EN LA ASOCIACION
    perror("ERROR AL ASOCIAR EL SOCKET AL PUERTO DEL SERVER");
    return 1;
    }
    puts("PUERTO CREADO EN EL SERVER CORRECTAMENTE");

    //MODO ESCUCHA CONEXIONES ENTRANTES
    listen(socket_desc , 3); // TRES CONEXIONES PERMITIDAS

    //ACEPTA CONEXIONES ENTRANTES
    puts("A LA ESPERA DE CONEXIONES ENTRANTES");
    c = sizeof(struct sockaddr_in);
    while( (client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c)) ) // CONEXION ACEPTADA 
    {
    puts("CONEXION ACEPTADA");

    pthread_t sniffer_thread;
    new_sock = malloc(1);
    *new_sock = client_sock;

    if( pthread_create( &sniffer_thread , NULL ,  connection_handler , (void*) new_sock) < 0)
    {
        perror("NO SE PUDO CREAR EL THREAD");
        return 1;
    }


    }

    if (client_sock < 0)
    {
    perror("FALLO");
    return 1;
    }

    return 0;
}

/*
 * HABILITAR VARIAS CONEXIONES
 * */
void *connection_handler(void *socket_desc)
{
    //SOCKET
    int sock = *(int*)socket_desc;     
        char buf[BUFFER_SIZE];

        while(1)
        { 

       FILE * fpIn = fopen("/mnt/SHARED/La.Lista.De.Schindler.Latino.avi", "r"); //ARCHIVO A ENVIAR
           ssize_t bytesRead = fread(buf, 1, sizeof(buf), fpIn);
           if (bytesRead <= 0) break;  // EOF

           printf("Se han leido %i bytes del archivo, enviandolos ...\n", (int)bytesRead);
           if (send(sock, buf, bytesRead, 0) != bytesRead) // ENVIAR EN EL SOCKET
           {
              perror("AL ENVIAR!!");
              break;
           }
        }

    //LIBERAR EL SOCKET
    free(socket_desc);

    return 0;
}

This is the client code这是客户端代码

#include<stdio.h> //printf
#include<string.h>    //strlen
#include<sys/socket.h>    //socket
#include<arpa/inet.h> //inet_addr

static const int BUFFER_SIZE = 16*1024;

int main(int argc , char *argv[])
{
    int sock;
    struct sockaddr_in server;

    //CREAR SOCKET
    sock = socket(AF_INET , SOCK_STREAM , 0);
    if (sock == -1)
    {
        printf("NO SE PUDO CREAR EL SOCKET");
    }
    puts("EL SOCKET FUE CREADO");

    server.sin_addr.s_addr = inet_addr("127.0.0.1"); // IP SERVER
    server.sin_family = AF_INET;//SOCKET IP
    server.sin_port = htons(9999); //PUERTO

    //CONECTAR AL SERVER
    if (connect(sock , (struct sockaddr *)&server , sizeof(server)) < 0)
    {
        perror("LA CONEXION FALLO");
        return 1;
    }

    puts("CONEXION ESTABLECIDA\n");

            FILE * fpIn = fopen("/home/soporte/PELI", "w");//ARCHIVO RECIBIDO
            if (fpIn)
            {
               char buf[BUFFER_SIZE];
               while(1)
               {
                  ssize_t bytesReceived = recv(sock, buf, sizeof(buf), 0);
                  if (bytesReceived < 0) perror("RECEPCION");  //ERROR AL RECIBIR
                  if (bytesReceived == 0) break;   //SE CIERRA LA CONEXION AL FINAL DEL ARCHIVO

                  printf("Se han recibido %i bytes desde la red, escribiendo a un archivo...\n", (int) bytesReceived);
                  if (fwrite(buf, 1, bytesReceived, fpIn) != (size_t) bytesReceived)
                  {
                     perror("fwrite");
                     break;
                  }
               }

               fclose(fpIn);
            }
            else printf("Error, no se pudo abrir el archivo [%s]\n", "/home/soporte/ESTEBAN");

    close(sock);
    return 0;
}

I run this code with gdb following are the back trace... got sigpipe 我用gdb运行此代码,以下是追溯信息... sigpipe

SOCKET CREADO PUERTO CREADO EN EL SERVER CORRECTAMENTE SOCKET CREADO PUERTO CREADO ZH-CN SERVER CORRECTAMENTE
A LA ESPERA DE CONEXIONES ENTRANTES LA ESPERA DE CONEXIONES入选
CONEXION ACEPTADA ACEPTADA展览会
Se han leido 11 bytes del archivo, enviandolos ... Se han leido 11个字节的del archivo,enviandolos ...
Se han leido 11 bytes del archivo, enviandolos ... Se han leido 11个字节的del archivo,enviandolos ...

Program terminated with signal SIGPIPE, Broken pipe. 程序以信号SIGPIPE终止,管道断开。

In your server code you open your file continuously in while....loop . 在服务器代码中,您可以在while....loop连续打开文件。 is it for any purpose? 是出于任何目的吗?

Your handler in Server looks like as follows 您在Server中的处理程序如下所示

/*
 * HABILITAR VARIAS CONEXIONES
 * */
void *connection_handler(void *socket_desc)
{
       //SOCKET
        int sock = *(int*)socket_desc;     
        char buf[BUFFER_SIZE];
        FILE * fpIn = fopen("/mnt/SHARED/La.Lista.De.Schindler.Latino.avi", "r"); 
        while(1)
        { 

          //ARCHIVO A ENVIAR
           ssize_t bytesRead = fread(buf, 1, sizeof(buf), fpIn);
           if (bytesRead <= 0) break;  // EOF

           printf("Se han leido %i bytes del archivo, enviandolos ...\n", (int)bytesRead);
           if (send(sock, buf, bytesRead, 0) != bytesRead) // ENVIAR EN EL SOCKET
           {
              perror("AL ENVIAR!!");
              break;
           }
        }

    //LIBERAR EL SOCKET
    free(socket_desc);
    fclose(fpIn);
    return 0;
}

Change 更改

new_sock = malloc(1);

for 对于

new_sock = malloc(sizeof(*new_sock));

And make sure that in connection_handler function, when you try to open the file, you really do it. 并确保在connection_handler函数中,当您尝试打开文件时,确实做到了。 (fpIn > 0) Otherwise, you should break the while. (fpIn> 0)否则,应暂停一会儿。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM