2015-07-21 3 views
-1

Мне нужно отправить данные с помощью socket в linux. Я использую сокеты для отправки и каналы для получения данных. Когда я пытаюсь отправить данные в функцию: SendGTSMessage, я получаю значение данных отправки как пустое. Я также получаю Segmentation fault Ошибка при попытке доступа Bytessent в SendGTSMessage.Ошибка Linux Socket/Segmentation

SendGTSMessage Функция вызывается от HandleGtsMessage Функция.

Любые идеи было бы полезно,

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 with error %d\n",errno); 
     perror("Failed to create Socket"); 
     MsgBox("Failed To create Socket"); 
      // return; 
    } 
    if (bind(listen_socket,(struct sockaddr*)&local, sizeof(local))) 
    { 
     sprintf(OutputString,"*** bind() failed with error %d\n",errno); 
     perror("bind() failed with error"); 
     MsgBox("bindfailed with error"); 
    // MessageBox(NULL, OutputString,"ERROR", MB_OK); 
    // return; 
    } 
    logMessage("Socket Binded.\n"); 
    if (listen(listen_socket,5) <0) 
    {  
     sprintf(OutputString,"*** listen() failed with error %d\n",errno); 
     perror("listen() failed with error"); 
     MsgBox("listen() failed with 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"); 
     // We are waiting for a 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 the string. Ignore the 0x85 at the end. 
     Buffer[retval-1] = 0; 
     logMessage("Buffer Message",&Buffer[4]); 
     HandleGTSMessages(&Buffer[4]); 
     logMessage("Message passed to 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 with 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 the normal message, if we ran the crmvs program to disable 
    // or enable telemetry. 
    if ((ExecutingBuiltInProgram) && (forceMsgExactly == false))  
    { 
     HandleGTSMessages("ADV"); 
     if (strstr(MsgToSend,"PASSED")) 
     // Advance the telemetry command. 
     MsgToSend = BuiltInPassedMsg; 
     else 
     MsgToSend = BuiltInFailedMsg; 

     msgLength = strlen (MsgToSend);  
     } 

    // Copy in the msg to send, and terminate it with a 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) 
    { 
     // Just re-use the same buffer for the 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;*/ 
} 
+2

попробуйте запустить программу в отладчик, как GDB – Pradheep

+1

Может быть, это будет какой-то использования http://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – Cobusve

ответ

-1

sprintf(GTSConnectionStatus, GTSNotConnected); это не правильный способ использования sprintf.

см man page

+0

Несмотря на необычность и небезопасность использования 'sprintf()' в качестве замены 'strcpy()', это не обязательно * неверно *. Однако, не имея декларации о наличии каких-либо «GTSConnectionStatus» или «GTSNotConnected», мы не можем быть уверены, что это правильно. –

+1

Но может вызвать ошибку сегментации –

+1

Это * может * вызвать segfault, но вы не можете узнать, делает ли это *. *. Вы даже не объяснили обстоятельства, при которых это было бы сделано. Было бы разумным в этом случае опубликовать комментарий по вопросу, запрашивающему информацию, необходимую для принятия этого решения. –