2011-08-14 9 views
0

私は非常に特殊な問題があります。私のコードは一度正しく実行された後、linuxで端末を閉じてコードを実行するために再度開いたが、今はセグメント違反が発生している。正確に何が起こったのかを解読することはできません...どんな助けもありがとうございます。ソケットのセグメンテーションフォルトエラー

マイコード:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include "unistd.h" 
#include <syslog.h> 
#include <math.h> 
#define MAXPROFILES 2 

float Pearson(int mySum, int recSum, int multSum); 

int main(int argc, char *argv[]) 
{  
    int sockfd, newsockfd, portno, clilen; 
    struct sockaddr_in serv_addr, cli_addr; 
    unsigned char buf[1024]; 

    /*int my_data2[10] = {1,3,9,10}; 

    int my_data[10] = {0}; // = {1,2,3,4,5}; 
    int myDataBinary[500] = {0}; 
    int myDataBinary2[500] = {0}; 
    int recData[500] = {0};*/ 

    int index1=0; 
// char* pointer = buf; 

    struct profile_t 
    { 
     unsigned char length; 
     unsigned char type; 
     unsigned char *data; 
    }; 

    typedef struct profile_datagram_t 
    { 
     unsigned char *src; 
     unsigned char *dst; 
     unsigned char ver; 
     unsigned char n; 
     struct profile_t profiles[MAXPROFILES]; 
    } header; 


    header outObj; 

    int j =0; 
    int i =0; 


    if (argc < 2) { 
     fprintf(stderr,"usage: %s port_number1",argv[0]); 
     exit(1); 
    } 

    sockfd = socket(AF_INET, SOCK_STREAM, 0); 

    if (sockfd < 0) 
    error("ERROR DETECTED !!! Problem in opening socket"); 

    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    portno = atoi(argv[1]); 

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

    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) 
      error("ERROR DETECTED !!! There was a problem in binding"); 

    listen(sockfd, 10); 
    clilen = sizeof(cli_addr); 



    printf("Server listening on port number %d...\n", serv_addr.sin_port); 

    while(1){ 
     newsockfd = accept(sockfd,(struct sockaddr *) &cli_addr, &clilen); 

     if (newsockfd < 0) 
     error("ERROR DETECTED !!! the connection request was not accepted"); 

     int rc = read(newsockfd,buf,100); 
     if(rc < 0){ 
       printf("error"); 
     } 
     else { 
      printf("success %d",rc); 
     } 


    outObj.src = malloc(4);// ***Editor's comment: try gdb/valgrind next time + examine your memory allocating arguments*** 
    outObj.dst = malloc(4); 
    // printf(pointer); 
    memcpy(outObj.src,buf+0,4); 
    memcpy(outObj.dst,buf+4,4); 
    memcpy(&outObj.ver,buf+8,1); 
    memcpy(&outObj.n,buf+9,1); 

     printf("\nSource IP = "); 
     for(int i=0;i<4;i++){ 
     printf("%d ",outObj.src[i]); 
     } 

     printf("\nDestination IP = "); 
     for(int i=0;i<4;i++){ 
     printf("%d ",outObj.dst[i]); 
     } 

     printf("\nVersion = %d",outObj.ver); 
     printf("\nNumber of messages = %d",outObj.n); 

     int k = 10; 

     for(i=0;i<outObj.n;i++){ 
     memcpy(&outObj.profiles[i].length,buf+k,1); 
     memcpy(&outObj.profiles[i].type,buf+k+1,1); 
     outObj.profiles[i].data = malloc(outObj.profiles[i].length); 
     memcpy(outObj.profiles[i].data,buf+k+2,5); 
     k +=7; 
     } 

     for(int i=0;i<outObj.n;i++){ 
      printf("\n------- Message %d --------",i+1); 
      printf("\nLength : %d",outObj.profiles[i].length); 
      printf("\nType : %d\n",outObj.profiles[i].type); 
      for(int j=0;j<5;j++){ 
       printf(" Data[%d] : %d",j,outObj.profiles[i].data[j]); 
      } 
     } 

    /* 
    for(int i=0; i<sizeof(my_data)/sizeof(int);i++) 
    { 
     if(my_data[i] > 0){ 
      index1 = my_data[i]; 
      myDataBinary[index1] = 1; 
      printf("my data %d = %d\n",index1,myDataBinary[index1]); 
      } 
    } 

    for(int i=0; i<sizeof(my_data2)/sizeof(int);i++){ 
     if(my_data2[i] > 0){ 
      index1 = my_data2[i]; 
      myDataBinary2[index1] = 1; 
      printf("my data %d = %d\n",index1,myDataBinary2[index1]); 
      } 
     }*/ 


    float rho; 

    for(int i=0;i<outObj.n;i++){ 
     printf("\n\n---------- Values for Data Profile %d ------------",i+1); 
     index1=0; 
     int sumRecievedData = 0; 
     int sumMyData = 0; 
     int sumMultpliedData = 0; 
     int my_data[10] = {0};// = {1,2,3,4,5}; 
     int myDataBinary[500] = {0}; 
     int recData[500] = {0}; 

     if(i==0){ 
      my_data[0] = 1; 
      my_data[1] = 3; 
      my_data[2] = 9; 
      my_data[3] = 10; 
     } 
     else if(i==1){ 
      my_data[0] = 1; 
      my_data[1] = 2; 
      my_data[2] = 3; 
      my_data[3] = 4; 
      my_data[4] = 5; 
     } 

     for(int i=0; i<sizeof(my_data)/sizeof(int);i++){ 
      if(my_data[i] > 0){ 
       index1 = my_data[i]; 
       myDataBinary[index1] = 1; 
       //printf("my data %d = %d\n",index1,myDataBinary[index1]); 
      } 
     } 

     for (int j=0; j<outObj.profiles[i].length;j++) { 
       if(outObj.profiles[i].data[j] > 0){ 
       index1 = outObj.profiles[i].data[j]; 
       recData[index1] = 1; 
       } 
     } 

     for(int i=0;i<500;i++){ 
      sumRecievedData += recData[i]; 
      sumMyData += myDataBinary[i]; 
      sumMultpliedData += recData[i] * myDataBinary[i]; 
     } 

     printf("\nrecSum = %d, \nmySum = %d, \nmultSum = %d\n",sumRecievedData,sumMyData,sumMultpliedData); 

     rho = Pearson(sumMyData,sumRecievedData,sumMultpliedData); 
     printf("\nPearson Coefficient for Data Profile %d= %f\n",i+1,rho); 
    } 









    } 
    return 0; 
    } 


    float Pearson(int mySum, int recSum, int multSum){ 
    float Cov =0; 
    float sdMyData = 0; 
    float sdRecievedData =0; 
    float rho; 
    int n = 500; 

    Cov = (1.0/(n-1))*(multSum - (1.0/n)*mySum*recSum); 
    sdMyData = sqrt((1.0/(n-1))*(mySum - (1.0/n)*mySum*mySum)); 
    sdRecievedData = sqrt((1.0/(n-1))*(recSum - (1.0/n)*recSum*recSum)); 
    printf("\nCovariance = %f, \nVarianceMyData = %f, \nVarianceRecData = %f",Cov,sdMyData,sdRecievedData); 
    if (sdMyData == 0.0 || sdRecievedData == 0.0){ 
     rho = 0.0; 
    } 
    else{ 
      rho = Cov/(sdMyData*sdRecievedData); 
    } 

    return(rho); 
    } 
+2

デバッガでプログラムを実行し、正確にクラッシュする場所を教えてください。スタックトレースも投稿してください。 – Codo

+0

私はリモートのLinuxマシンで実行しています。この同じコードは一度完全に実行され、私は端末を閉じ、今はそれを実行しようとしています。 – user537670

+0

@ user537670: "問題は、リモートで実行できるGDBなどのデバッガでセグメント違反をデバッグすることです。クラッシュした場所を確認し、「バックトレース」を使用してその場所を確認します。 –

答えて

3

私は本当に答えに投稿のように感じることはありませんが、私は大きなshoutoutをさせていただきたいと思い何かがあります。

まず第一に、gdb.ItはコンパイルがGDBのコマンドインタフェースでsuccessful.Thenであれば、あなたがgcc -o ex ex.c -g .Invoke gdb ./exをコンパイルするときscene.Add -gオプションの後ろに何があるかを調べるために、かなり便利な方法で使用することを学ぶしてくださいrun [-all sorts of arguments and options you have initially set up in your program]と入力すると、gdbはプロセス/スレッドの呼び出しと必要なものすべてを表示します。簡単な気分です。

第二には、あなたのコードでは、明らかにあなたは、我々はmanページに持っているもの間違ったfashion.Thatのにメモリを割り当てる:

#include <stdlib.h> 

void *malloc(size_t size); 
void free(void *ptr); 
void *realloc(void *ptr, size_t size); 
void *calloc(size_t nmemb, size_t size); 

は、あなたのケースでは、あなたがheader_imgonnause = (header*)malloc(sizeof(header)*memoryiwannahave)のようにそれをしなければならない参照してください。

は第三に、おそらく最後のものは、このコードでセグメンテーションフォールトの観点から、あなたはaccept()read()write()に見ている?壊れたパイプを接続している場合は、bashがあなたがfault.Ifは、GDBを使用してSEG要求されます、あなたはそれが事実であるかどうかを知るでしょう。

gdb/valgrindを使用してください。

関連する問題