c - Linux Socket /Segmentation Fault -


i need send data using socket in linux. using sockets sending , pipes receiving data.when try send data in function :sendgtsmessage ,i getting send data value empty. getting segmentation fault error when try access bytessent in sendgtsmessage.

sendgtsmessage function called handlegtsmessage function.

any insights helpful,

void* begingtsserver(void* arg) {    char                 buffer[1000];    char                 *interface= null;    unsigned short       port=default_port;    int                  retval;    socklen_t                  fromlen;    struct sockaddr_in   local;    struct sockaddr_in  from;    int                 listen_socket;    int                  continuemsgs = 1;    int                  errnumber;    char                outputstring[255];     local.sin_family = af_inet;   // local.sin_addr.s_addr = (!interface)?inaddr_any:inet_addr(interface);    local.sin_addr.s_addr =inaddr_any;        local.sin_port = htons(port);     listen_socket = socket(af_inet,sock_stream,0); // tcp socket    logmessage("socket created.\n");        if (listen_socket<0)    {       sprintf(outputstring,"*** socket() failed error %d\n",errno);       perror("failed create socket");       msgbox("failed create socket");            // return;    }    if (bind(listen_socket,(struct sockaddr*)&local, sizeof(local)))    {       sprintf(outputstring,"*** bind() failed error %d\n",errno);       perror("bind() failed error");       msgbox("bindfailed error");      // messagebox(null, outputstring,"error", mb_ok );     //  return;    }    logmessage("socket binded.\n");     if (listen(listen_socket,5) <0)    {            sprintf(outputstring,"*** listen() failed error %d\n",errno);        perror("listen() failed error");        msgbox("listen() failed error");       //messagebox(null, outputstring,"error", mb_ok );       // return;    }  logmessage("listen succeded.\n");   fromlen =sizeof(from);    gluedebug = true; printf("listen_socket",listen_socket);  msgsock =accept(listen_socket,(struct sockaddr *) &from, &fromlen);   if (msgsock== -1) {           sprintf(outputstring,"*** accept() error %d\n",errno);       perror("accept() error");       msgbox("accept() error");       //messagebox(null, outputstring,"error", mb_ok );       // return; }     gtsconnected = true; logmessage("gts connected.\n"); while( 1 ) {         retval = recv(msgsock,buffer,sizeof(buffer),0 );     if (retval<0)     {         perror("reading stream message error");         errnumber = errno;         if (errno != econnrefused )         {             //fprintf(stderr,"*** recv() failed: error %d\n",errnumber);         }     }     else     {          errnumber = 0;     }     if (retval == 0 || errnumber == econnrefused )     {          logmessage("gts connection terminated.\n");          msgbox("gts connection terminated.\n");          // waiting connection.          sprintf( gtsconnectionstatus, gtsnotconnected);          gtsconnected = false;          close(msgsock);          msgsock = accept(listen_socket,(struct sockaddr*)&from,(socklen_t *) &fromlen);           if (msgsock <0)          {             sprintf(outputstring,"*** accept() error %d\n",errno);             msgbox("accept() error");             //messagebox(null, outputstring,"error", mb_ok );             //return;          }          gtsconnected = true;          continue;       }       // null terminate string.  ignore 0x85 @ end.       buffer[retval-1] = 0;       logmessage("buffer message",&buffer[4]);       handlegtsmessages(&buffer[4]);       logmessage("message passed handle function");       continue;    } }  void handlegtsmessages(char *message) {    int loop;    char localmsgbuffer[1024];    char strippedmessage[1024]; //   char message[1024];    char *programargument[9] = {null, null, null, null, null, null, null, null, null};    logmessage("program:%s\n",message);           if (!strncmp(message,"isprogrunning",strlen("isprogrunning")))    {       if (tstprogramconnected)          sprintf(localmsgbuffer, "true:%s",executingvsprogram);       else          sprintf(localmsgbuffer, "false");       sendgtsmessage(localmsgbuffer, strlen(localmsgbuffer), true);      return;    }    else if (!strncmp(message,"inforequest", strlen("inforequest")))    {       char hostname[255];       char cwd[1024];       char stationtype[25];        strcpy(hostname,"unknown");       gethostname(hostname,254);       getcwd( cwd, 1023 );       strcpy(stationtype,"unknown");        loop = 0;        while (station[loop].stationstring[0] != 0)       {          if (fileexist(station[loop].filetest))          {             strcpy(stationtype,station[loop].stationstring);             break;          }          loop++;       }      sprintf(localmsgbuffertest,"version: %s\n,hostname:%s\n,execution dir:%s\n,station type:%s",       version,hostname,cwd,stationtype);      logmessage("info request:%s\n",localmsgbuffertest);      sendgtsmessage(localmsgbuffertest,strlen(localmsgbuffertest),true);      return;    } }  int sendgtsmessage(char *msgtosend, int msglength, bool forcemsgexactly) {    char buffer[1000];    int bytessent;    int shiftedmsglength;    struct hostent *hp;    struct sockaddr_in server;    char dum[40];    /* local.sin_family = af_inet;      local.sin_addr.s_addr =inaddr_any;         local.sin_port = htons(port);     sock=socket(af_inet, sock_stream, 0);    connect(sock,(struct sockaddr*)&local, sizeof(local));    logmessage("connected send gts",msgtosend); gtsconnected =true;*/  int sock;  sock = socket(af_inet, sock_stream, 0); char buffer[256]; char hostname[1024];  server.sin_family = af_inet; gethostname(hostname,sizeof(hostname)); hp = gethostbyname(hostname); memcpy(&server.sin_addr,hp->h_addr,hp->h_length); server.sin_port = htons(port);  connect(sock,(struct sockaddr *) &server,sizeof(server)); if (gtsconnected == true) {    // overwrite normal message, if ran crmvs program disable     // or enable telemetry.    if ((executingbuiltinprogram) && (forcemsgexactly == false))        {       handlegtsmessages("adv");       if (strstr(msgtosend,"passed"))       // advance telemetry command.          msgtosend = builtinpassedmsg;       else          msgtosend = builtinfailedmsg;         msglength = strlen (msgtosend);           }       // copy in msg send, , terminate 0x85.      strncpy(&buffer[4], msgtosend, msglength);      // logmessage("message length  %s\n", msglength);      *(buffer+msglength+4) = (char)0x55;      shiftedmsglength = (msglength) << 8;      memcpy(&buffer[0], &shiftedmsglength, 4);      *(buffer) = (char)0xaa;       bytessent = send(sock,buffer,msglength+5,0);      logmessage("message length  %s\n",buffer);      if (bytessent <0)      {          // re-use same buffer error message.          sprintf(buffer,"*** send() failed: error %d\n",strerror(errno));          msgbox("send() failed");         // messagebox(null, buffer,"error", mb_ok );       }    }    //logmessage("bytes sent %s\n",bytessent);    // return bytessent;*/ } 

sprintf(gtsconnectionstatus, gtsnotconnected); not correct way use sprintf.

refer man page


Comments