Многопоточный сервер на С

Пытаюсь реализовать многопоточный сервер на С

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <memory.h>
#include <string.h>
#include <errno.h>
#include<stdlib.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<pthread.h>


void *connection_handler(void *);


int main(int argc, char * argv)
{
  int port;
  int socket_desc, new_socket, s, *new_sock;
  struct sockaddr_in server, client;

  FILE *pFile;
  pFile = fopen("/home/logs", "w");
  if (pFile!=NULL)
      {
           fclose (pFile);
       }


  printf("Введите номер порта сервера: ");
  scanf("%d/n", &port);

  /*создаём сокет*/
  socket_desc = socket(AF_INET, SOCK_STREAM, 0);
  if(s < 0)
  {
          perror("Ошибка вызова сокета");
          return 0;
  }

  /*определяем прослушиваемый порт и адрес*/
  server.sin_family = AF_INET;
  server.sin_port = htons(port);
  server.sin_addr.s_addr = INADDR_ANY;
  if(bind(socket_desc, (struct sockaddr *)&server, sizeof(server)) < 0)
  {
          perror("Ошибка соеденения");
          return 0;
  }

  /*слушаем порт*/
  listen(socket_desc, 5);
  puts("Ожидание входящих соединений...");

  /*читаем данные из сокета*/
  s = sizeof(struct sockaddr_in);
  while ((new_socket = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&s)))
  {
          puts("Соединение принято");

          pthread_t sniffer_thread;
          new_sock = malloc(1);
          *new_sock = new_socket;

          if(pthread_create(&sniffer_thread, NULL,  connection_handler(new_socket, socket_desc), (void*) new_sock) < 0)
          {
              perror("Поток не создан");
              return 1;
           }



  }

  return 0;
}


void *connection_handler(void *new_socket, void *socket_desc)
{
   char buffer[100];

for(;;)
{
    memset(buffer, 0, sizeof(char)*100);
    int rc = recv(new_socket, buffer, 100, 0);
    if( rc < 0 )
    {
            
            if(errno == EINTR )
                    continue;
            perror("Не могу получить данные.");
            return 0;
    }

    if( rc == 0 )
            break;
    printf("%s\n", buffer);


    // строка для записи в файл
       char * message = buffer;
       // файл для записи
       char * filename = "/home/logs";
       // запись в файл
       FILE *fp = fopen(filename, "w");
       if(fp)
       {
           // записываем строку
           fputs(message, fp);
           fclose(fp);

       }
 }

free(socket_desc);

return 0;
 }

но выдаёт ошибку при вызове функции connection_handler

ошибка: too many arguments to function ‘connection_handler’ if(pthread_create(&sniffer_thread, NULL, connection_handler(new_socket, socket_desc), (void*) new_sock) < 0)

ошибка: conflicting types for ‘connection_handler’ void *connection_handler(void *new_socket, void *socket_desc)

Как я понимаю вызываю её в новом потоке передаю ей параметры далее она записывает в файл полученные данные почему то так не работает?


Ответы (0 шт):