2012-03-23 13 views
-3
#include <iostream> 
#include <stdlib.h> 
#include <stdio.h> 
#include <netinet/in.h> 
#include <netdb.h> 
#include <sys/socket.h> 
#include <sys/types.h> 
#include <string.h> 
#include <cstdio> 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    int port, n,sockfd; 
    struct sockaddr_in srv_addr; 
    struct hostent *serv; 

    char buffer[256]; 

    if(argc<3) { 
     cout <<"\n ussage: host port\nexiting\n"; 
     return 0; 
    } 

    port = atoi(argv[2]); 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 

    if (sockfd < 0) { 
     cout <<"\nsocket creation on"<<port<<" failed\nexiting\ncheck to see if port is in use"; 
     return 0; 
    } 

    serv = gethostbyname(argv[1]); 

    if (serv=NULL) { 
     cout << "\n" << serv << " is not a valid host name\nexiting"; 
     return 0; 
    } 

    bzero((char *) &srv_addr, sizeof(srv_addr)); 

    srv_addr.sin_family = AF_INET; 

    bcopy((char *) serv->h_addr, (char *) &srv_addr.sin_addr.s_addr, serv->h_length); 

    srv_addr.sin_port=htons(port); 
    if (connect(sockfd,(sockaddr*)&srv_addr, sizeof (srv_addr)) < 0) { 
     cout << " \nconnection failed\n";} 
     return 0; 
    } 

    cout << "\nType message\n"; 

    bzero(buffer, 256); 

    cin.getline(buffer,256); 

    n = write(sockfd,buffer,strlen(buffer)); 
    if (n>0) { 
     cout <<"\nsocket write error\nexiting\n"; 
    } 

    n = read(sockfd,buffer,255); 
    if (n>0) { 
     cout << "\nsocket read error\nexiting\n"; 
    }   

    cout << buffer; 
    return 0; 
} 

Der Code kompiliert jetzt dank einiger Hilfe von Arrowdodger, aber jetzt bekomme ich segfault Fehler. Ich versuchte, eine cout <<"1" Anweisung zu setzen, um zu sehen, wo im Programm versucht wird, Speicher an der falschen Stelle zu schreiben, aber nach dem letzten Versuch es gleich nach int main(), wirft es immer noch den Fehler vor dem Drucken 1 auf dem Bildschirm. Ich weiß, das ist wahrscheinlich eine wirklich einfache Frage, aber ich bin wieder einmal ratlos. Dies ist nicht nur mein erster INET-Code, sondern auch mein erster Socket-Code.C++ INET nein, segfault

+0

Nein, dieser Code würde nicht kompilieren. Setzen Sie bitte den richtigen Code. – littleadv

+0

Ich habe wahrscheinlich die Schiene entfernt, während ich meinen Testcout << "1" entfernt habe; um hoffentlich zu sehen, wo der Fehler war. – TaroKhan

Antwort

0

Ihr Code fehlt die öffnende Klammer nach main(). gdb kann Ihnen sagen, wie dies segfauling ist.

$ g++ -g inetnoob.cpp 
$ gdb a.out 
(gdb) set args a.out localhost 35 
(gdb) run 

Es Segfaults, weil man nie für serv Speicher zuweisen.

+0

Ich bearbeitet und jetzt sind alle meine Einzüge vermasselt> :(bare mit mir Jungs, krank bekommen dort. – TaroKhan

+0

'gethostname' reserviert diesen Speicher; jedoch setzt er' serv' auf 'NULL' direkt darunter. –

+0

Oh, ich sehe es Wenn du Vergleiche anstellst, versuche, die Konstante auf die linke Seite zu setzen, damit der Compiler sich beschweren wird, anstatt ihn zufällig zu vergleichen. – mkb

1

In Zeile

if (serv=NULL) { 

Sie setzen serv-NULL statt es zu NULL vergleichen.

Ich empfehle dringend, dass Sie lernen, einen Debugger zu verwenden. zeigen Sie sofort Lage Ihres segfault würde dieses Programm in gdb läuft:

bcopy((char *) serv->h_addr, (char *) &srv_addr.sin_addr.s_addr, serv->h_length); 

und Sie würden herausfinden, dass serv NULL waren, wenn man es nicht erwartet hatten.

Den Code hier zu veröffentlichen und zu erwarten, dass Hunderte von Menschen ihn für Sie Korrektur lesen, ist für sie kurzfristig eine Verschwendung von Zeit und für Sie auf lange Sicht.

+0

Danke und dein Recht – TaroKhan

+0

Fühlen Sie sich frei, die Antwort zu akzeptieren, wenn es Ihr Problem löste. –