2014-10-07 4 views
0

내 클라이언트가 서브넷의 모든 서버에 UDP 브로드 캐스트를 보냈습니다. 각 서버는 클라이언트가 서버 IP 주소를 얻거나 저장할 수 있도록 클라이언트에 응답합니다. 매번 모든 서버가 메시지를받을 수있는 것은 아닙니다 (아마도 UDP 때문입니까?). 서버의 새 IP 주소를 찾으면 브로드 캐스트 할 카운터를 늘리는 가장 좋은 방법입니까?서버에서 여러 sendto() 수신

다른 문제는 현재 클라이언트 쪽에서 발생하며 한 번에 하나의 메시지 만 받게됩니다. 동시에 여러 메시지를받을 수 있습니까?

이 내 클라이언트 코드입니다 : 당신이 방송을 보내면

if (recvfrom(Socket, receiveBuffer, BUFLEN, 0, (struct sockaddr *) &connectedSocket, &length) == SOCKET_ERROR) 
    { 
     printf("\nrecvfrom() failed with error code : %d" , WSAGetLastError()); 
     closesocket(Socket); 
     WSACleanup(); 
     exit(EXIT_FAILURE); 
    } else { 
     printf("\nServer Says : "); 
     printf("\n\nI am from %s:%d\n", inet_ntoa(connectedSocket.sin_addr), ntohs(connectedSocket.sin_port)); 
    } 

답변

0

, 타이머를 시작하고 5-30초 등에 실행하자. 이 기간 동안 귀하가받는 모든 답장을 처리하십시오. 타이머가 경과하면 더 이상 응답을 처리하지 않고 수신 한 경우 그냥 버립니다.

아니요, UDP 소켓은 한 번에 여러 데이터 그램을 제공 할 수 없으므로 개별적으로 읽어야합니다.

+0

내가하려는 것은 기본적으로 (서버를 실행하는) 로컬 네트워크의 모든 컴퓨터를 쿼리하는 것입니다. 한 번에 1 개의 메시지 만받을 수 있기 때문에 새 IP 주소인지 확인하는 방법에 대해 어떻게 생각합니까? 그렇다면 카운터를 늘려 (원래 5는 말할 수 있습니다) 5할까요? more broadcasts – John

+0

카운터 나 여러 방송을 전혀 사용할 필요가 없습니다. 하나의 브로드 캐스트를 보냅니다. 새로운 IP가 보이면 목록에 추가하고 계속 진행하십시오. 답장을받을 수있는 시간을주십시오. 즉각적이지 않을 수 있습니다. 한 번에 하나 이상의 메시지를받을 수 없기 때문에 SOCKET을 사용할 수 없다는 것을 의미하지는 않습니다. 이유 때문에 내부 수신 버퍼가 있습니다. 버퍼가 채워지지 않을 정도로 충분히 빨리 읽는다면 응답을 잃지 않을 것입니다. –

+0

위의 코드를 (recvfrom ..) 블록을 무한 루프로 테스트 해보고 모든 응답을 얻었습니다! 버퍼에 대한 도움과 정보를 보내 주셔서 감사합니다. – John

관련 문제