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
Post a Comment