Я пытаюсь запустить некоторый код из терминала с помощью аргументов. Вот мой код:Ошибка сегментации (сбрасывание ядра) из аргумента командной строки
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()« Не совсем уверен, что это такое.
c не имеет ограничений на размеры аргументов в командной строке. это наложено вашей оболочкой. Вам нужно показать, что делает эта функция 'concat'. Это не стандартная функция C. string concatenation выполняется 'strcat'. И так как ваш неудачный - один символ длиннее другого, у вас, вероятно, есть переполнение. –
сделал u запустил его под отладчиком - это покажет вам, где его сбой – pm100
@VishnuMurale Это код _full_? Какие заголовки вы включаете? – DaV