2013-09-27 47 views
0

我注意到netcat不允許你在端口範圍內監聽單個端口。我用C和一個客戶端和一個服務器函數編寫了一個基本的netcat類程序。我現在正在研究在多個端口上進行監聽的最佳方式。在多個端口綁定/監聽,是否正確的方式?

我的目標用法是:program localhost 200 300(其中200開始,300結束端口)。

pthreads是否是最好的方法?在每個線程上綁定/偵聽,然後在建立連接時將它們連接起來備份?

iret1 = pthread_create(&thread1, NULL, bind_function, (void*) somename); 
pthread_join(thread1, NULL); 

線程確實是新的天地,我不知道是否有一個更簡單的辦法,或者你將如何使用iret1(返回值)進一步。任何人都可以添加到此?

須知Dolda2000:

上的epoll的利用方法,我碰到:

for (j = 1; j < argc; j++) { 
     fd = open(argv[j], O_RDONLY); 
     if (fd == -1) 
      errExit("open"); 
     printf("Opened \"%s\" on fd %d\n", argv[j], fd); 

     ev.events = EPOLLIN;   /* Only interested in input events */ 
     ev.data.fd = fd; 
     if (epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev) == -1) 
      errExit("epoll_ctl"); 
    } 

我的綁定代碼:

if (bind(sockfd, (struct sockaddr *) &server_addr, server_len) < 0) 
     error("ERROR"); 
     listen(sockfd,5); 

newsockfd = accept(sockfd, (struct sockaddr *) &client_addr, &clilen); 
+0

如果你只是想聽聽,看看@ Dolda2000的答案。有一些東西會激發線程在select上,但只是監聽端口不是其中之一。 – jedwards

+0

IIRC每個線程的默認開銷爲8mb開銷,對於小程序(<8mb),分支通常更輕,但select/poll/epoll會更加輕微 – technosaurus

回答

2

當然,它會更容易和資源密集程度較低改爲使用select/poll/epoll

我不知道你遇到問題到底是什麼,所以這裏的使用poll一些示例代碼:

int listentoall(int firstport, int lastport) 
{ 
    int i, nsk; 
    int nfd = lastport - firstport + 1; 
    struct pollfd fds[nfd]; 
    struct sockaddr_in name; 

    memset(&name, 0, sizeof(name)); 
    name.sin_family = AF_INET; 
    for(i = 0; i < nfd; i++) { 
     fds[i].fd = socket(PF_INET, SOCK_STREAM, 0); 
     name.sin_port = htons(firstport + i); 
     bind(fds[i].fd, (struct sockaddr *)&name, sizeof(name)); 
     listen(fds[i].fd, 5); 
     fds[i].events = POLLIN; 
    } 

    while(1) { 
     poll(fds, nfd, -1); 
     for(i = 0; i < nfd; i++) { 
      if(fds[i].revents & POLLIN) { 
       nsk = accept(fds[i].fd, NULL, NULL); 
       for(i = 0; i <nfd; i++) 
        close(fds[i].fd); 
       return(nsk); 
      } 
     } 
    } 
} 

注意,我剛纔寫的代碼,現在無需編譯,所以很可能有是錯別字,什麼都不是,它顯然沒有錯誤檢查,但也許這足以解釋一般結構?

+0

對不起,您將如何迭代範圍中的端口綁定並註冊他們爲epoll?我也正確地認爲選擇不足以滿足1-65k的全部端口範圍?一旦在任何端口上收到連接,我都希望它們全部解除連接,並停止與連接的端口進行聆聽 – OBV

+0

您對迭代所有套接字有什麼疑問?它是你不明白的API還是別的?然而,你認爲'select'不會那麼遠,但是'poll'和'epoll'都可以工作。 – Dolda2000

+0

謝謝你的回答。我用示例api的用法更新了我的帖子,並在其下面介紹瞭如何綁定/收聽/接受一個端口。迭代的意思是我可以做一個for循環來綁定/監聽端口範圍,但是我不確定epoll和accept()之間的相互作用。 – OBV