Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 8

Pthread_create несколько переменных

06.11.2014, 17:57. Показов 1169. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток всем.

Прошу сильно не пинать - новичек в C++

Взял пример из сети - работа сокетов и потоки, все работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <stdio.h>
#include <string.h>    //strlen
#include <stdlib.h>    //strlen
#include <sys/socket.h>
#include <arpa/inet.h> //inet_addr
#include <unistd.h>    //write
#include <pthread.h> //for threading , link with lpthread
 
void *connection_handler(void *);
 
int main(int argc , char *argv[])
{
    int socket_desc , new_socket , c , *new_sock;
    struct sockaddr_in server , client;
    char *message;
     
    //Create socket
    socket_desc = socket(AF_INET , SOCK_STREAM , 0);
    if (socket_desc == -1)
    {
        printf("Could not create socket");
    }
     
    //Prepare the sockaddr_in structure
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons( 8888 );
     
    //Bind
    if( bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0)
    {
        puts("bind failed");
        return 1;
    }
    puts("bind done");
     
    //Listen
    listen(socket_desc , 3);
     
    //Accept and incoming connection
    puts("Waiting for incoming connections...");
    c = sizeof(struct sockaddr_in);
    while( (new_socket = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c)) )
    {
        puts("Connection accepted");
         
        //Reply to the client
        message = "Hello Client , I have received your connection. And now I will assign a handler for you\n";
        write(new_socket , message , strlen(message));
         
        pthread_t sniffer_thread;
        new_sock = malloc(1);
        *new_sock = new_socket;
         
        if( pthread_create( &sniffer_thread , NULL ,  connection_handler , (void*) new_sock) < 0)
        {
            perror("could not create thread");
            return 1;
        }
        //Now join the thread , so that we dont terminate before the thread
        //pthread_join( sniffer_thread , NULL);
        puts("Handler assigned");
    }
     
    if (new_socket<0)
    {
        perror("accept failed");
        return 1;
    }
     
    return 0;
}
 
/*
 * This will handle connection for each client
 * */
void *connection_handler(void *socket_desc)
{
  for (;;) {
    //Get the socket descriptor
    char buffer[256];
    int sock = *(int*)socket_desc;
//    int n;
     
    char *message;
    bzero(buffer,256);
//    n = read(sock,buffer,255);
    read(sock,buffer,255);
    printf("Here is the message: %s\n",buffer); 
 
    message = "OK\n";
    write(sock , buffer , strlen(buffer));
     
  }
  //Free the socket pointer
  free(socket_desc);
     
  return 0;
}
понадобильсь в функцию connection_handler передать еще переменные, пробовал через struct, т.к. через pthread_create невозможно передать больше 1й переменной:

C++
1
2
3
4
struct arg_struct {                                                                                                       
    int test;
    int *new_sock;
};
Но ничего не вышло, переменные передаются, но не socket_desc.
Подскажите как это сделать.
И объясните почему передается переменная new_sock, а функция принимает socket_desc?

Заранее спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.11.2014, 17:57
Ответы с готовыми решениями:

Подскажите как преобразовать несколько чисел из одной строки, и несколько int переменных
Доброго времени, ломаю голову над задачей второй день, но что то ускользает от меня. суть задачи: написать функцию, которая принимает в...

потоки (pthread_create) И exec()
Всем добрый день! Пишу лабу и возникла такая проблемам: Мне необходимо в новом потоке с помощью exec() функции вызвать некую другую...

Pthread_create особенности вызова
Всем привет! Имеется большущий чужой проект, который приходится поддерживать. Есть стандартный запуск потока аля void*...

2
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
07.11.2014, 11:12
C++
1
2
3
4
5
6
7
8
9
10
struct arg_struct {                                                                                                       
    int test;
    int new_sock;
};
 arg_struct args;
args.new_socket = new_socket;
args.test = //что то там;
 
 
pthread_create( &sniffer_thread , NULL ,  connection_handler , (void*)&args);
C++
1
2
3
4
5
6
7
8
void connection_handler(void * args)
{
arg_struct p = (arg_struct*)args;
 
int sock = p->new_socket;
int  test = p->test;
rect(sock, ///);
}
1
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 8
13.11.2014, 10:51  [ТС]
Спасибо, все получилось.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.11.2014, 10:51
Помогаю со студенческими работами здесь

Передача трёхмерного массива в pthread_create
Решить задачу с помощью нескольких потоков. Каждый поток должен вывести свой идентификатор и отработать заданное время. Массивы...

Не вызывается функция в pthread_create полученная из dlsym
Передо мной поставлена следующая задача: Реализовать программу по склейки одного файла из множества мелких, количество потоков в четыре...

Передача функции-члена класса в pthread_create
Здравствуйте, товарищи! Существует ли корректный способ передать указатель на функцию-член класса в качестве параметра в функцию...

Несколько переменных в empty?
Как написать IF(), чтобы была проверка нескольких переменных empty. И чтобы если хоть одна переменная не задана, то FALSE???

несколько переменных в texBox
Здрасте.. нужно написать 2 переменные в текстбокс через тире.. я их написал а как тире туда засунуть хз..)) textBox1.Text...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru