来自命令行参数的分段错误(核心转储)

时间:2016-07-14 18:40:12

标签: c segmentation-fault command-line-arguments

我正在尝试使用参数从终端运行一些代码。这是我的代码:

int PORT_NUM = 0;
int BYTES_TO_SEND = 0;
char* LocalAddresss = "";


char* concat(char *s1, char *s2)
{
    char *result = malloc(strlen(s1)+strlen(s2)+1);
    strcpy(result, s1);
    strcat(result, s2);
    return result;
}

void error(const char *msg)
{
    perror(msg);
    exit(0);
}

int main(int argc, char *argv[])
{
    int sockfd, portno, n;
    struct sockaddr_in serv_addr;
    struct hostent *server;

    char buffer[256];
    char data[BYTES_TO_SEND];

    LocalAddresss = concat("192.168.1.",argv[1]);
    PORT_NUM = atoi(argv[2]);
    BYTES_TO_SEND = atoi(argv[3]);

    fflush(stdout);

    for(int i = 0; i < BYTES_TO_SEND; i++){
        data[i] = 'Z';
    }

    char* message_to_send = data;

    portno = PORT_NUM;
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) 
        error("ERROR opening socket");

    server = gethostbyname(LocalAddresss);
    if (server == NULL) {
        fprintf(stderr,"ERROR, no such host\n");
        exit(0);
    }
    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, 
         (char *)&serv_addr.sin_addr.s_addr,
         server->h_length);
    serv_addr.sin_port = htons(portno);

    if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
        error("ERROR connecting");

    while(1){
        n = write(sockfd,message_to_send,strlen(message_to_send));
    }

    close(sockfd);
    return 0;
}

我的问题是这个。以下工作:命令行上的./TCP_client 16 2000 100

这不是:./TCP_client 16 2000 3000

我得到“Segmentation fault(core dumped)”

命令行参数中的总字节数是否有限制?我该如何解决这个问题?

用GDB运行后,它说“程序接收信号SIGBUS,总线错误.x0000000100000ccf in main()”不确定这是什么。

2 个答案:

答案 0 :(得分:1)

这是失败的,因为你要声明大小为0的数据

int BYTES_TO_SEND = 0;
...
char data[BYTES_TO_SEND];
'''
LocalAddresss = concat("192.168.1.",argv[1]);
PORT_NUM = atoi(argv[2]);
BYTES_TO_SEND = atoi(argv[3]);

你需要移动线

int BYTES_TO_SEND = 0;
...
LocalAddresss = concat("192.168.1.",argv[1]);
PORT_NUM = atoi(argv[2]);
BYTES_TO_SEND = atoi(argv[3]);
char data[BYTES_TO_SEND];
'''

但这是一个糟糕的计划 - 在堆栈上放置一个像这样的大缓冲区,最好是malloc它。你的例子可行,但它不是一个好的设计

答案 1 :(得分:-2)

如果我是你,我将使用string.h库中的strcat()函数。

#include <string.h>
...
char LocalAddresss[15] = "192.168.1.";
strcat(LocalAddress, argv[1]);