2012-12-11 198 views
2

事情是這樣的,我寫在C簡單的TCP套接字服務器(使用UNIX系統調用),我是不是能夠得到接受連接。Unix下C套接字服務器不接受連接

從我可以告訴,我通過服務器初始化拿到就好了,但是當我嘗試連接到我打印出來的端口(見下面的代碼)它拒絕彷彿無所不有。

更重要的是,當我用netstat端口甚至沒有使用。我並沒有在當前的設置中拋出任何錯誤,我都爲了創意而枯竭。

int main(){ 

    int sock_fd; 
    int conn_fd; 
    struct sockaddr_in serv_addr; 
    struct sockaddr_in cli_addr; 
    socklen_t* serlen; 
    socklen_t* clilen; 
    clilen = malloc(sizeof(socklen_t)); 
    serlen = malloc(sizeof(socklen_t)); 
    *serlen = sizeof(serv_addr); 
    *clilen = sizeof(cli_addr); 

    /*=============================Create Socket=============================*/ 


     //Create Socket 
     sock_fd = socket(AF_INET, SOCK_STREAM, 0); 
      if(sock_fd<0){ 
       fprintf(stderr,"error creating socket\n"); 
       exit(1);} 

     //Initialize Server Address Struct 
     bzero((char *) &serv_addr, *serlen); 
     serv_addr.sin_family = AF_INET; 
     serv_addr.sin_addr.s_addr = INADDR_ANY; 
     serv_addr.sin_port = 0; 

    /*=============================Bind Address==============================*/ 

     //Bind socket to an address 
     if(bind(sock_fd,(struct sockaddr*)&serv_addr,*serlen)<0){ 
      fprintf(stderr,"error binding\n"); 
      exit(1);} 

     //Get socket data 
     if(getsockname(sock_fd,(struct sockaddr*)&serv_addr, serlen)<0){ 
      fprintf(stderr,"error with socket name"); 
      exit(1);} 

    /*=============================Server Started============================*/ 

     //Listen for connections 
     listen(sock_fd,32); 

     //Print port 
     printf("%i", serv_addr.sin_port); 

     conn_fd = accept(sock_fd,(struct sockaddr*)&cli_addr,clilen); 

     /**Do something exciting with my new connection**/ 

} 
+1

你檢查的iptables和SELinux的? – anishsane

+1

檢查您的防火牆是否阻止了這些端口。 – askmish

+0

已檢查並清除。他們是內核通過請求到插座爲「0」,所以我想象這是綁定的情況下自動分配的端口,但它是值得一試又 – darkpbj

回答

1

道具@askmish爲激勵這一

//Print port 
    printf("%i", serv_addr.sin_port); 

成爲

//Print port 
    printf("%i", htons(serv_addr.sin_port)); 
4

你真的想試聽端口零嗎?嘗試一個高端口號,最好> 1024./etc/services會給出一個關於空閒端口的提示 - 但它只是一組註釋,這些端口號不會被強制執行。

編輯:另一條線索。端口號應爲網絡訂單,所以分配應使用htons()。可能是因爲你可能在小端機器上(比如英特爾),所獲得的「隨機數」是簡單的數字,顯示爲亂碼。當你打印它們時,使用ntohs()將它們轉換回來。

+0

如果你試圖在端口零聽...我很驚訝'綁定'成功 – Useless

+0

嗯,我認爲綁定到0(bind(2))會自動分配一個端口。我在檢查套接字描述符之前調用getsockname以確保發生這種情況。 (即良好的捕捉,但我確認這在代碼中是可以的) – darkpbj

+1

@darkpbj它在手冊中說了什麼?如果綁定分配了一些任意的端口,你怎麼知道要連接哪一個端口? – iabdalkader

1

在您的代碼:

  • 相反的:

    serv_addr.sin_port = 0; 
    

    試試這個:

    serv_addr.sin_port=htons(2056);//Any port no. 
    
  • 相反的:

    listen(sock_fd,32); 
    

    試試這個:

    if(listen(sock_fd,SOMAXCONN)<0)//Just to be sure that you are considering max. no. of requests 
    { fprintf(stderr,"error with listen"); 
        exit(1);} 
    
  • 而且爲:

    conn_fd = accept(sock_fd,(struct sockaddr*)&cli_addr,clilen); 
    

    補充一點:

    if(conn_fd <0) 
    { 
        //handle the error here 
    } 
    

如果沒有這些解決您的問題,那麼,可能有問題與客戶端代碼或您的服務器環境。

+0

所有好的建議,並通過它的工作幫助我得出我剛剛發佈的答案 – darkpbj

相關問題