2017-10-11 55 views
0

我有一個tcp服務器和2個客戶端想連接到它。這種客戶端將連接的方式是,其中1個,讓我們打電話client1將連接發送數據和其他,client2,將最終連接,發送少量的數據和斷開連接。我設置了O_NONBLOCK選項。我所經歷的行爲是,在服務器端持續發送數據的客戶端收到一條消息並等待下一個連接...這是我到目前爲止所嘗試的(代碼是在任何時刻client2想要的時刻連接和發送數據,並斷開):tcp非阻塞不起作用

fcntl(sockfd, F_SETFL, O_NONBLOCK); 
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) 
    error("ERROR on binding"); 

listen(sockfd, 5); 
clilen = sizeof(cli_addr); 

int flag = 0; 

do { 

    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); 

    if(newsockfd > 0){ 
     //Sockets Layer Call: inet_ntop() 
     inet_ntop(AF_INET6, &(cli_addr.sin6_addr),client_addr_ipv6, 100); 
     printf("Incoming connection from client having IPv6 address: %s\n",client_addr_ipv6); 


     n = recv(newsockfd, buffer, 49,0); 

     if(n > 0){ 

      send_data(argv[1],argv[2],argv[3],argv[4],argv[5],argv[6],buffer); 
      memset(buffer,0,sizeof(buffer)); 
     } 
    } 
    newsockfd2 = accept(sockfd, (struct sockaddr *) &cli_addr2, &clilen); 

    //Sockets Layer Call: inet_ntop() 
    if(newsockfd2 > 0){ 
     inet_ntop(AF_INET6, &(cli_addr2.sin6_addr),client_addr_ipv6, 100); 
     printf("Incoming connection from client having IPv6 address: %s\n",client_addr_ipv6); 
     n2= recv(newsockfd2, buffer, 49, 0); 
     if(n2 > 0){ 

      send_data(argv[1],argv[2],argv[3],argv[4],argv[5],argv[6],buffer); 
      memset(buffer,0,sizeof(buffer)); 
     } 
    } 


}while(!flag); 

我也試圖加入,而裏面的選項,並在newsockfdnewsockfd2,但同樣的結果設置非阻塞。

我在做什麼錯?謝謝 ! :D

+0

你顯示的代碼會發生什麼?您是否嘗試過使用調試器單步執行代碼?沒有一個系統函數返回錯誤?你爲什麼要做同樣的事情兩次? –

+0

打開兩個插座,而不是在兩者之間跳躍。與非阻塞通信,你應該使用epoll(或選擇,或任何類型的東西)。否則,沒有人會等任何東西,那就是非阻塞的全部目的。 – Slava

+0

@Slava,所以你告訴我1個套接字不能同時處理2個連接? – Lomazo

回答

0

當一個新的套接字從accept接受時,你必須用這個套接字創建一個新的線程,以便在這個線程中處理一對一的通信。襪子不必非阻擋。