C ++ INET noob,segfault

时间:2012-03-23 23:35:26

标签: c++ c sockets

#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的一些帮助,但现在我遇到了段错误。我尝试使用cout <<"1"语句来查看程序在哪里尝试在错误的位置写入内存,但是在int main()之后最终尝试它之后,它仍会在打印之前抛出错误{{1到屏幕。我知道这可能是一个非常简单的问题,但我又一次感到难过。这不仅是我的第一个INET代码,它也是我的第一个套接字代码。

2 个答案:

答案 0 :(得分:1)

排队

if (serv=NULL) {

您将serv设置为NULL,而不是将其与NULL进行比较。

我强烈建议您学习如何使用调试器。在gdb中运行此程序将立即显示您的segfault的位置:

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

并且当你没想到它时,你会发现serv是NULL。

在这里发布您的代码并期望数百人为您校对,这对他们来说是短期内的浪费时间,也是长期的浪费时间。

答案 1 :(得分:0)

您的代码在main()之后缺少左括号。 gdb可以告诉你这是如何分裂的。

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

它是段错误的,因为你永远不会为serv分配内存。