2016-07-14 108 views
1

我想从终端使用参数运行一些代码。这里是我的代码:从命令行参数分割故障(核心转储)

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

我得到“分割故障(核心转储)”

有没有在命令行参数什么的总字节数限制?我该如何解决这个问题?

使用GDB运行后,它说“在main()中编程接收到的信号SIGBUS,总线错误0x0000000100000ccf”但是不确定这是什么。

+1

c对命令行参数大小没有限制。这是你的shell强加的。你需要显示这个'concat'函数在做什么。这不是一个标准的C函数。字符串连接由'strcat'完成。而且因为你的失败者比另一个更长,你可能会在某处溢出。 –

+2

是否在调试器下运行它 - 这会告诉你它崩溃的位置 – pm100

+0

@VishnuMurale是否是_full_代码?你包括什么标题? – DaV

回答

-2

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

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

没有足够的数组。 –

+0

你的意思是不够数组? – p4p1

+1

没有足够的数组*大小*。初始化值已经在使用'11'。 –

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更好。你的例子可以工作,但它不是一个好的设计

+0

这不能解决我的问题。另外,这个工作的原因是“./TCP_client 16 2000 100”,这不是“./TCP_client 16 2000 3000”,这让我觉得这个问题在别处。 –

+0

你正在得到未定义的行为,事情将随机工作,并随机失败。 Y我们的代码可能有其他错误,但这肯定是一个严重的错误。您是否在调试器下运行? – pm100

+0

只是。更新了我的帖子。 –