2012-03-23 4 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; 
} 

이제 Arrowdodger의 도움으로 코드가 컴파일되지만 이제는 segfault 오류가 발생합니다. 나는 cout <<"1" 문장을 넣어서 프로그램에서 잘못된 위치에 메모리를 쓰려고 시도했으나, 마지막으로 int main() 뒤에 시도한 후에도 화면에 1을 인쇄하기 전에 여전히 오류가 발생합니다. 나는 이것이 아마도 매우 간단한 질문이라는 것을 알고 있지만, 다시 한번 나는 혼란 스럽다. 이것은 나의 첫 번째 소켓 코드 인 나의 첫 번째 INET 코드 일 뿐만이 아니다.C++ INET noob, segfault

+0

아니요,이 코드는 컴파일되지 않습니다. 진짜 코드를 입력하십시오. – littleadv

+0

내 테스트를 제거하는 중괄호를 제거했습니다. cout << "1"; 그 잘못이 어디에 던지고 있는지 잘 알기 위해서. – TaroKhan

답변

0

main() 뒤에 여는 중괄호가 없습니다. gdb은 어떻게 이것이 segfaulting인지 말할 수 있습니다. 당신이 serv 메모리를 할당하지 않기 때문에

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

그것은 세그먼테이션 폴트 (segfault). 라인

if (serv=NULL) { 

에서

+0

편집했는데 지금 내 들여 쓰기가 엉망이되었습니다.> :(남자들과 잘 어울리지 않습니다.) – TaroKhan

+0

'gethostname'은 그 메모리를 할당하지만, 바로 아래에'serv'를'NULL'로 설정하고 있습니다. –

+0

오, 알겠습니다. .Of. OP를 비교할 때 왼쪽에 상수를 놓으십시오. 컴파일러가 우연히 비교하는 대신 할당하면 문제가됩니다. – mkb

1

당신은 NULL과 비교하는 대신 servNULL에 설정합니다.

디버거 사용 방법을 배우는 것이 좋습니다. GDB에이 프로그램을 실행하면 즉시 귀하는 segfault의 위치를 ​​보여줄 것이다 :

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

을 당신은 당신이 그것을 기대하지 때 serv이 NULL했다 알아낼 것입니다.

여기에 코드를 게시하고 수백 명의 사람들이 당신을 위해 교정 해 줄 것을 기대하는 것은 단기간에 그리고 장기간 당신을 위해 낭비하는 시간입니다.

+0

감사합니다. 그리고 귀하의 권리. – TaroKhan

+0

문제가 해결되면 답변을 수락하십시오. –