2016-07-14 4 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 он говорит: «Программный сигнал SIGBUS, ошибка шины.0x0000000100000ccf в main()« Не совсем уверен, что это такое.

+1

c не имеет ограничений на размеры аргументов в командной строке. это наложено вашей оболочкой. Вам нужно показать, что делает эта функция 'concat'. Это не стандартная функция C. string concatenation выполняется 'strcat'. И так как ваш неудачный - один символ длиннее другого, у вас, вероятно, есть переполнение. –

+2

сделал u запустил его под отладчиком - это покажет вам, где его сбой – 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]; 
''' 

, но это плохой план - положить большой буфером, подобным этому в стеке, лучше его разбить. Ваш пример будет работать, но его неплохой дизайн

+0

Это не исправляет мою проблему. Кроме того, тот факт, что это работает «./TCP_client 16 2000 100», и это не «./TCP_client 16 2000 3000» заставляет меня думать, что проблема кроется в другом месте. –

+0

Вы получаете неопределенное поведение, вещи будут случайным образом работать и случайным образом терпеть неудачу. У вашего кода могут быть другие ошибки, но это наверняка серьезная ошибка. УДАЛ ЭТО ПОД ДЕВУШЕРОМ? – pm100

+0

как раз. обновил мой пост. –

Смежные вопросы