2016-06-24 15 views
0

Da ich weiß, dass Segmentierungsfehler auftritt, wenn wir auf einen Speicherort zugreifen, der nicht vom Betriebssystem zugewiesen wird, was verursacht hier das gleiche?Warum zeigt der Code einen Segmentierungsfehler?

#include<stdlib.h> 
#include<stdio.h> 
#include<string.h> 
#include<sys/socket.h> 
#include<unistd.h> 
#include<netinet/in.h> 
#include<arpa/inet.h> 
int main(int argc,char* argv[]) 
{ 
if(argc<3 || argc>4) 
    { 
    //diewithusermsg("Parameters","<Server_Address> <Echo_String> <Port_number>"); 
      } 
const char* servip = argv[1]; 
char* echostring = argv[2]; 
in_port_t servport = (argc==4)?atoi(argv[3]):7; 
int sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
if(sock<0) 
{ 
//diewithsysmsg("socket() failed"); 
} 
struct sockaddr_in servaddr; 
memset(&servaddr,0,sizeof(servaddr)); 
servaddr.sin_family=AF_INET; 
int rtnval = inet_pton(AF_INET,servip,&servaddr.sin_addr.s_addr); 
return 0; 
} 

bei servip Parameter von inet_pton

+0

Willkommen bei Stack-Überlauf! Es klingt, als müssten Sie lernen, wie Sie einen Debugger verwenden, um durch Ihren Code zu gehen. Mit einem guten Debugger können Sie Ihr Programm Zeile für Zeile ausführen und sehen, wo es von dem, was Sie erwarten, abweicht. Dies ist ein essentielles Werkzeug, wenn Sie programmieren wollen. Weiterführende Literatur: [Wie kleine Programme zu debuggen] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

+0

Ich weiß, es ist abweichend bei inet_pton –

+0

Sicher - so ist der nächste Schritt, Ihren Debugger zu verwenden, um die Parameter zu überprüfen, die Sie an die Funktion übergeben. –

Antwort

1

Wenn Sie Parameter an das Programm nicht passieren, wird das Programm zum Absturz bringen. Parameter übergeben und es stürzt nicht ab:

> valgrind ./a.out 127.0.0.1 foo 80 
==22863== Memcheck, a memory error detector 
==22863== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. 
==22863== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info 
==22863== Command: ./a.out 127.0.0.1 foo 80 
==22863== 
servip: 127.0.0.1 
==22863== 
==22863== HEAP SUMMARY: 
==22863==  in use at exit: 0 bytes in 0 blocks 
==22863== total heap usage: 0 allocs, 0 frees, 0 bytes allocated 
==22863== 
==22863== All heap blocks were freed -- no leaks are possible 
==22863== 
==22863== For counts of detected and suppressed errors, rerun with: -v 
==22863== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 

-Code unverändert:

#include<stdlib.h> 
#include<stdio.h> 
#include<string.h> 
#include<sys/socket.h> 
#include<unistd.h> 
#include<netinet/in.h> 
#include<arpa/inet.h> 
int main(int argc,char* argv[]) 
{ 
    if(argc<3 || argc>4) 
    { 
     //diewithusermsg("Parameters","<Server_Address> <Echo_String> <Port_number>"); 
    } 
    const char* servip = argv[1]; 
    char* echostring = argv[2]; 
    in_port_t servport = (argc==4)?atoi(argv[3]):7; 
    int sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
    if(sock<0) 
    { 
//diewithsysmsg("socket() failed"); 
    } 
    struct sockaddr_in servaddr; 
    memset(&servaddr,0,sizeof(servaddr)); 
    servaddr.sin_family=AF_INET; 
    fprintf(stderr, "servip: %s\n", servip); 
    int rtnval = inet_pton(AF_INET,servip,&servaddr.sin_addr.s_addr); 
    return 0; 
} 
Verwandte Themen