Intereting Posts
Objective-C variable … указывает на себя? Настройки NetBeans для GCC Синтаксис PythonError при вложении в C Linux TCP-сервер: чтение IP-адреса клиента перед принятием соединения Как реально реализуются структуры на языке программирования C? Компиляция исходного файла с использованием system (), ‘главная ссылка из неявного ввода / запуска для основного исполняемого файла Как жить streamовым видео с помощью программы C. Какой должен быть ответ HTTP? Как я могу использовать закодированную кодировку, если это возможно? Бесконечная recursion в C Почему стандарт C ++ указывает, что целое число со знаком присваивается без знака в двоичных операциях со смешанной подписью? Какие функции в стандартной библиотеке C обычно поощряют плохую практику? О неопределенном поведении Почему я не могу создать «мир привет» для glib? Использование X-списков и директив препроцессора для создания настраиваемого кода C Во время компиляции Можно ли использовать цикл for для изменения имени переменной в C? Какова цель первого «узла» в объявлении: «typedef struct node {- – -} Node;»?

C-чат-программа получает ошибку Ошибка сегментации (сбрасывание ядра)

Я создаю чат-программу между клиентом и сервером на языке C. Клиент будет подключаться к серверу, отправляет ему сообщение. Тогда сервер ответит, что meesage.

Если к серверу подключен другой клиент, новому соединению будет создан новый stream. Поэтому я использую pthread.h для создания многопоточной программы чата на C. Пожалуйста, посмотрите код server.c и client.c ниже, чтобы получить более подробную информацию.

server.c

#include  #include  #include  #include  #include  #define PORT 7778 void error(char *msg){ perror(msg); exit(1); } void *clientHandler(void*); int main(){ printf("INFO enter the main()\n"); int sockfd, newsockfd, clilen; char buffer[256]; struct sockaddr_in serv_addr, cli_addr; int n, threadID; pthread_t interrupt; printf("INFO before calling socket()\n"); sockfd = socket(AF_INET, SOCK_STREAM, 0); printf("INFO after calling socket()\n"); if(sockfd < 0) error("ERROR opening socket\n"); printf("INFO before calling bzero()\n"); bzero((char*) &serv_addr, sizeof(serv_addr)); printf("INFO after calling socket()\n"); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(PORT); printf("INFO after assigning Internet info\n"); if(bind(sockfd, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) < 0) { error("ERROR on binding\n"); return 0; } printf("INFO before calling listen()\n"); listen(sockfd, 5); printf("INFO before entering While(1)\n"); while(1) { int re; clilen = sizeof(cli_addr); printf("INFO before calling accept()\n"); newsockfd = accept(sockfd, (struct sockaddr*)&cli_addr, &clilen); if(newsockfd < 0){ error("ERROR on accepting\n"); return 0; } printf("INFO before calling pthread_create()\n"); re = pthread_create(&interrupt, NULL, clientHandler, NULL); if(re){ printf("ERROR return code from the pthread_create() is %d\n", re); } } printf("INFO before calling pthread_exit(NULL)\n"); pthread_exit(NULL); return 0; } void *clientHandler(void *param){ int n, newsockfd; newsockfd = *((int*)param); char buffer[256]; bzero(buffer, 256); while(1){ n = read(newsockfd, buffer, 255); if(n < 0){ error("ERROR reading from socket\n"); pthread_exit(NULL); } printf("Server received the message: %s", buffer); n = write(newsockfd, "Server got it\n", 18); if(n < 0){ error("ERROR writing to socket\n"); pthread_exit(NULL); } } } 

client.c

 #include  #include  #include  #include  #include  #define PORT 7778 #define HOSTNAME "127.0.0.1" void error(char*msg){ perror(msg); exit(1); } int main(){ int sockfd, n; struct sockaddr_in serv_addr; struct hostent* server; //char *hostname = "127.0.0.1"; char buffer[256]; sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd h_addr, (char*)&serv_addr.sin_addr.s_addr, server->h_length); serv_addr.sin_port = htons(PORT); if(connect(sockfd, &serv_addr, sizeof(serv_addr)) < 0){ error("ERROR connecting\n"); return 0; } while(1) { printf("Please enter the message: "); bzero(buffer, 256); fgets(buffer, 255, stdin); n=write(sockfd, buffer, strlen(buffer)); if(n < 0){ error("ERROR reading from socket\n"); return 0; } printf("[Server got it] %s\n", buffer); } return 0; } в #include  #include  #include  #include  #include  #define PORT 7778 #define HOSTNAME "127.0.0.1" void error(char*msg){ perror(msg); exit(1); } int main(){ int sockfd, n; struct sockaddr_in serv_addr; struct hostent* server; //char *hostname = "127.0.0.1"; char buffer[256]; sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd h_addr, (char*)&serv_addr.sin_addr.s_addr, server->h_length); serv_addr.sin_port = htons(PORT); if(connect(sockfd, &serv_addr, sizeof(serv_addr)) < 0){ error("ERROR connecting\n"); return 0; } while(1) { printf("Please enter the message: "); bzero(buffer, 256); fgets(buffer, 255, stdin); n=write(sockfd, buffer, strlen(buffer)); if(n < 0){ error("ERROR reading from socket\n"); return 0; } printf("[Server got it] %s\n", buffer); } return 0; } 

ОК, я успешно создал файлы * .c в среде Linux, используя терминал.

Я использовал эту командную строку для сборки server.c

 gcc server.c -o server.out -pthread 

и использовать его для создания client.c

 gcc client.c -o client.out 

Затем я вызываю server.out для запуска сервера:

  ./server.out 

и запустите client.out

 ./client.out 

НО, в то время, когда я запускаю server.out, я получил ошибку:

 Segmentation fault (core dumped) 

Ребята, не могли бы вы поделиться со мной своими впечатлениями об этом. Является ли мой код неправильным?

Эта строка передает NULL в качестве аргумента обработчика

  re = pthread_create(&interrupt, NULL, clientHandler, NULL); 

Так должно быть:

  re = pthread_create(&interrupt, NULL, clientHandler, &newsockfd); 

как комментирует Сурав Гош.

Вам нужно передать идентификатор newsockt в новый созданный stream.

поэтому измените

  re = pthread_create(&interrupt, NULL, clientHandler, (void*)&newsockfd); 

Я добавил третий аргумент здесь


typecasting with (void *) не даст вам одного предупреждения 🙂