2017-10-11 1 views
0

TCP 서버와 연결하려는 클라이언트가 2 대 있습니다. 이 클라이언트가 연결하는 방법은 그 중 하나입니다. client1은 항상 데이터를 보내고 나머지는 client2으로 연결하고, 소량의 데이터를 보내고 연결을 끊습니다. 나는 O_NONBLOCK 옵션을 켰다. 내가 경험하는 동작은 서버 측에서 연속적으로 데이터를 보내는 클라이언트가 하나의 메시지를 받고 다음 연결을 기다리는 것입니다. 여기는 지금까지 시도한 것입니다 (코드는 잠시 동안 client2이 원하는 곳입니다.)에 연결하고 데이터를 전송하고 분리 :tcp nonblocking not working

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

두 개 사이에서 점프하는 대신 두 개의 소켓을 엽니 다. 그리고 non-blocking 통신을 사용하면 epoll을 사용하도록되어 있습니다 (또는 그 종류의 것을 선택해도됩니다). 그렇지 않으면 아무도 아무것도 기다리지 않습니다. 그것은 비 차단의 모든 목적입니다. – Slava

+0

@Slava, 그래서 당신은 1 개의 소켓이 2 개의 연결을 동시에 처리 할 수 ​​없다고 말하고 있습니까? – Lomazo

답변

0

accept에서 새 소켓을 다시 받으면이 소켓에서 일대일 통신이 처리되도록 새 소켓을 만들어야합니다. socked는 non-blocking하지 않아도됩니다.