2016-07-05 49 views
0

所以我有一个非常基本的tcp服务器,它有两个线程监听两个独立的端口。但是,当代码运行时,第二个线程永远不会被创建,并且看起来第一个线程实际上阻止了整个程序创建下一个线程。下面是代码......(很简单)Raspberry PI多线程套接字问题C

void *Listener1(); 
void *Listener2(); 

int main() 
{ 
    pthread_t thread1, thread2; 
    pthread_create(&thread1, NULL,Listener1(), NULL); 
    pthread_create(&thread2, NULL,Listener2(), NULL); 
    sleep(50); 
    return 0; 
} 
void *Listener1() 
{ 
    int sockfd, newsockfd; 
    socklen_t clilen; 
    struct sockaddr_in serv_addr, cli_addr; 

    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd < 0) 
     puts("ERROR opening socket"); 
    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = INADDR_ANY; 
    serv_addr.sin_port = htons(12346); 
    if (bind(sockfd, (struct sockaddr *) &serv_addr, 
       sizeof(serv_addr)) < 0) 
       puts("ERROR on binding"); 
    listen(sockfd,1); 
    clilen = sizeof(cli_addr); 

    newsockfd = accept(sockfd, 
       (struct sockaddr *) &cli_addr, 
       &clilen); 
    if (newsockfd < 0) 
      puts("ERROR on accept"); 
    else 
     puts("Client connected!"); 

    close(newsockfd); 
    close(sockfd); 
    return 0; 
} 
void *Listener2() 
{ 
    puts("hi)"); 
    int sockfd, newsockfd; 
    socklen_t clilen; 
    struct sockaddr_in serv_addr, cli_addr; 

    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd < 0) 
     puts("ERROR opening socket"); 
    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = INADDR_ANY; 
    serv_addr.sin_port = htons(12345); 
    if (bind(sockfd, (struct sockaddr *) &serv_addr, 
       sizeof(serv_addr)) < 0) 
       puts("ERROR on binding"); 
    listen(sockfd,1); 
    clilen = sizeof(cli_addr); 
    newsockfd = accept(sockfd, 
       (struct sockaddr *) &cli_addr, 
       &clilen); 
    if (newsockfd < 0) 
      puts("ERROR on accept"); 
    else 
     puts("Client connected!"); 

    close(newsockfd); 
    close(sockfd); 
    return 0; 
} 

回答

3

蛋糕在

pthread_create(&thread1, NULL,Listener1(), NULL); 
//          ^^ 
//       causes the function to be called 

这里仔细看你不指针传递给Listener1功能,你实际上是调用它,并且它的返回值将被用作指向线程函数的函数指针,如果它返回的话。

而应该通过一个函数指针:

pthread_create(&thread1, NULL,&Listener1, NULL);