Я предполагаю, что client_sock определен как "int client_sock". В этом случае вы должны написать следующее:
if (pthread_create(&newthread , NULL, (void * ) accept_request, &client_sock) != 0) {
Затем в accept_request (который, кстати, должен быть функцией, принимающей указатель) вы будете делать так:
void *accept_request( void *client_sock_addr ) {
int client_sock = *((int*) client_sock_addr);
}
Преобразование int в (void *) может быть непереносимым (поскольку размеры данных int и void * не обязательно совпадают). Конечно, это может работать на вашем текущем компиляторе ...
Спасибо jiles за указание на это: в зависимости от остальной части кода значение по этому адресу может измениться (например, если у вас есть цикл вокруг конструкции accept и 2 принятия приходят до создания одного потока). Самый хороший способ сделать это - распределить память с помощью malloc, например
int *client_sock_addr=malloc(sizeof(int));
*client_sock_addr = accept(server_sock, (struct sockaddr *)&client_name, &client_name_len);
if (pthread_create(&newthread , NULL, (void * ) accept_request, client_sock_addr) != 0) {
perror("pthread_create");
}
А затем в функции выполните:
void *accept_request( void *param ) {
int *client_sock_addr = (int*) client_sock_addr;
int client_sock = *client_sock_addr;
// Before exiting the thread
free(client_sock_addr);
}