Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2014, 00:27   #1
yans
 
Регистрация: 06.11.2014
Сообщений: 9
По умолчанию pthread_create несколько переменных

Доброго времени суток всем.

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

Взял пример из сети - работа сокетов и потоки, все раотает:
Код:
#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й переменной:
Код:
struct arg_struct {                                                                                                       
    int test;
    int *new_sock;
};
Но ничего не вышло
Подскажите как это сделать.
И объясните почему передается переменная new_sock, а функция принимает socket_desc?

Заранее спасибо.
yans вне форума Ответить с цитированием
Старый 06.11.2014, 01:50   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
И объясните почему передается переменная new_sock, а функция принимает socket_desc?
Не путайте локальную переменную в мейне и формальный аргумент у функции. То, что имена их совпадают, не делает их одной и той же переменной.

Цитата:
Но ничего не вышло
Открываем ман по функции pthread_create (он первый в гугле), прокручиваем вниз и видим... пример кода с передачей структуры, как параметра. Списать не получилось что ль?
p51x вне форума Ответить с цитированием
Старый 06.11.2014, 08:53   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Код:
new_sock = malloc(1);
*new_sock = new_socket;
Неправильный размер памяти.
И вообще, где вы здесь структуру увидели?
waleri вне форума Ответить с цитированием
Старый 06.11.2014, 10:23   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
И вообще, где вы здесь структуру увидели?
Это не здесь. Это пример из сети, а с структурой он пытался.
p51x вне форума Ответить с цитированием
Старый 06.11.2014, 11:03   #5
yans
 
Регистрация: 06.11.2014
Сообщений: 9
По умолчанию

Этот код полностью рабочий, и через структуру у меня получилось передавать переменные. Единственное не получилось передать new_sock.
И я не понимаю, почему в примере при передаче new_sock в функцию connection_handler приходит socket_desc?
yans вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как проверить сразу несколько переменных? ClMlD Общие вопросы Delphi 2 20.01.2013 02:04
Видимость переменных С# Paravozzz Помощь студентам 3 04.09.2012 09:10
1) как перетащить несколько модулей с одной книги на другую одним скопом? 2)можно ли открыть несколько книг сразу? БАХТИ Microsoft Office Excel 17 26.09.2011 18:11
Много переменных Altera Общие вопросы Delphi 15 18.07.2008 08:06
Замена переменных NoName_emaNoN Win Api 4 18.01.2008 09:05