2016-07-14 57 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

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