2014-10-18 5 views
1

Я изо всех сил пытаюсь создать сокеты через цикл for; цикл создаст поток для каждого сокета.создать сокет/поток в цикле

это мой текущий код, который работает просто отлично:

вход; ./client1 2344 или ./client1 2343. (2344 и 2343 - порты).

обращаться к розеткам, с резьбой каждого:

struct sockaddr_in serv; /* socket info about our server */ 
    struct sockaddr_in serv2; /* socket info about our server */ 
    int mysocket;   /* socket used to listen for incoming connections */ 
    int mysocket2; 

    memset(&serv, 0, sizeof(serv));   /* zero the struct before filling the fields */ 
    serv.sin_family = AF_INET;    /* set the type of connection to TCP/IP */ 
    serv.sin_addr.s_addr = htonl(INADDR_ANY); /* set our address to any interface */ 
    serv.sin_port = htons(PORTNUM);   
    memset(&serv2, 0, sizeof(serv2));   /* zero the struct before filling the fields */ 
    serv2.sin_family = AF_INET;    /* set the type of connection to TCP/IP */ 
    serv2.sin_addr.s_addr = htonl(INADDR_ANY); /* set our address to any interface */ 
    serv2.sin_port = htons(PORTNUM2);   /* set the server port number */ 
    // see http://stackoverflow.com/questions/15976137/local-host-server-socket-program-not-working 

    mysocket = socket(AF_INET, SOCK_STREAM, 0);  
    mysocket2 = socket(AF_INET, SOCK_STREAM, 0); 

    int optVal = 1; 
    if (setsockopt(mysocket, SOL_SOCKET, SO_REUSEADDR, &optVal, sizeof(int)) < 0) { 
     perror("Error setting socket option"); 
     exit(1); 
    }  
    if (setsockopt(mysocket2, SOL_SOCKET, SO_REUSEADDR, &optVal, sizeof(int)) < 0) { 
     perror("Error setting socket option"); 
     exit(1); 
    } 


    if (bind(mysocket, (struct sockaddr *)&serv, sizeof(struct sockaddr_in))){ 
     perror("Error binding socket to port"); 
     exit(1); 
    } 
    if (bind(mysocket2, (struct sockaddr *)&serv2, sizeof(struct sockaddr_in))){ 
     perror("Error binding socket to port"); 
     exit(1); 
    } 
    /* start listening, allowing a queue of up to 1 pending connection */ 
    listen(mysocket, SOMAXCONN); 
    listen(mysocket2, SOMAXCONN); 

    pthread_t inc_x_thread1; 
    pthread_t inc_x_thread2; 

    pthread_create(&inc_x_thread1, NULL, run, &mysocket); 
    pthread_create(&inc_x_thread2, NULL, run, &mysocket2); 
    pthread_join(inc_x_thread1, NULL); 
    pthread_join(inc_x_thread2, NULL); 

следующий код является моей попыткой повторного факторинга кода в цикле:

int socketDeckPair = 0; 
    int threads = 2; 
    pthread_t* tid[2]; 
    char* ports[] = {"2343", "2344"}; 

    //This is where the information about the incoming connection will 
    for(;socketDeckPair < 2; socketDeckPair=socketDeckPair+1){ 
     struct sockaddr_in serv; /* socket info about our server */ 

     int mysocket;   /* socket used to listen for incoming connections */ 

     memset(&serv, 0, sizeof(serv));   /* zero the struct before filling the fields */ 
     serv.sin_family = AF_INET;    /* set the type of connection to TCP/IP */ 
     serv.sin_addr.s_addr = htonl(INADDR_ANY); /* set our address to any interface */ 
     serv.sin_port = htons(atoi(ports[socketDeckPair]));   /* set the server port number */ 

     mysocket = socket(AF_INET, SOCK_STREAM, 0); 

     int optVal = 1; 
     if (setsockopt(mysocket, SOL_SOCKET, SO_REUSEADDR, &optVal, sizeof(int)) < 0) { 
      perror("Error setting socket option"); 
      exit(1); 
     } 

     if (bind(mysocket, (struct sockaddr *)&serv, sizeof(struct sockaddr_in))){ 
      perror("Error binding socket to port"); 
      exit(1); 
     } 

     listen(mysocket, SOMAXCONN); 

     pthread_create(&tid[socketDeckPair], NULL, run, &mysocket); 
    } 
    int i = 0; 
    for(; i < threads; i++){ 
     pthread_join(tid[i], NULL); 
    } 

теперь, если я были попробуйте запустить ./client1 2344, я получаю странные результаты. каждый раз, когда я бегу ./client1 альтернативный идентификатор потока в:

f77fe700 
f6dfd700 
f77fe700 
f6dfd700 
f77fe700 

Что я делаю неправильно?

благодаря Даниель

+1

Этот 'pthread_create (& TID [socketDeckPair]' должен вызывать компилятор, чтобы предупредить вас, по крайней мере, со всеми предупреждениями: '-Wall -Wextra -pedantic' (для gcc). Хорошая идея - сделать серьезные wanrings. – alk

+0

Предлагайте не создавать сокеты до тех пор, пока в потоке. Как бы то ни было, переменные, связанные с каждым сокетом,« повторно используются » 'для каждого сокета, а не уникального. – user3629249

ответ

2
  • Задача 1:

    pthread_t* tid[2]; 
    

    должны быть:

    pthread_t tid[2]; 
    

  • Задача 2:
    В следующей строке внутри for цикла:

    pthread_create(&tid[socketDeckPair], NULL, run, &mysocket); 
    

    вы используете локальную переменную mysocket, которая выходит за рамки, когда код reachs следующий } (т.е. к следующей строке).
    Вы передаете адрес переменной, один, который стал устаревшим в следующем }

+0

Да, это только ручка/маркер. Бросьте его и передайте его по значению. –

Смежные вопросы