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);
을 나는 또한 동안의 내부에 옵션을 추가하고 newsockfd
및 newsockfd2
하지만 같은 결과에 블로킹을 설정했습니다.
내가 뭘 잘못하고 있니? 감사 ! : D
표시되는 코드는 어떻게됩니까? 디버거를 사용하여 코드를 단계별로 실행 해 보았습니까? 어떤 시스템 함수도 오류와 함께 반환하지 않습니까? 왜 같은 일을 두 번하고 있니? –
두 개 사이에서 점프하는 대신 두 개의 소켓을 엽니 다. 그리고 non-blocking 통신을 사용하면 epoll을 사용하도록되어 있습니다 (또는 그 종류의 것을 선택해도됩니다). 그렇지 않으면 아무도 아무것도 기다리지 않습니다. 그것은 비 차단의 모든 목적입니다. – Slava
@Slava, 그래서 당신은 1 개의 소켓이 2 개의 연결을 동시에 처리 할 수 없다고 말하고 있습니까? – Lomazo