2010-01-10 3 views
-3

멀티 플레이 게임을 작성하고 있습니다 (분명히 UDP 소켓을 사용합니다 : 참고 : winsock 2.2 사용). 서버 코드는 다음과 같이 읽이 내 클라이언트에서 데이터를 수신하지 않는 동안UDP 소켓 문제

while(run) 
{ 
    select(0, &readSockets, NULL, NULL, &t) 
    if(FD_ISSET(serverSocket, &readSockets)) 
    { 
     printf("%s\n","Data receieved"); 
     //recvfrom over here 
    } 
    FD_SET(serverSocket, &readSockets); 
} 

을,이다 : 여기

recvfrom(serverSocket, buffer, sizeof(buffer), 0, &client, &client_size); 
+0

무엇이 문제입니까? 왜 당신은 recvfrom을 사용하지 않습니까? 이것은 UDP 소켓에서 읽을 수있는 표준 방법입니까? –

+0

@eli - 차단하고 싶지 않기 때문에 서버 콘솔도 새로 고침해야하므로 ... – aviraldg

+0

무엇이 문제입니까? – Kugel

답변

0

흠 ... 코드와 조금 하구 후, 내가 찾은이 라인 : 그래서

console->clear(); 
console->resetCursorPosition(); 

, 그것은 데이터를 수신했지만, 콘솔의 메시지는 즉시 삭제하기했다.

1

한 가지 문제는 아마도 select() 호출입니다. 첫 번째 매개 변수가 가장 높은 소켓 번호 +1이되어야한다고 생각합니다.

+0

그리고 어떻게 알 수 있습니까? – aviraldg

+0

winsock 문서 인용 : 매개 변수 1 : nfds - 이전 버전과의 호환성을 위해 포함됨 – aviraldg

+1

Windows가 아닌 시스템에서 작동하도록 지정해야합니다. 소켓 하나만 있으면'serverSocket + 1 '이됩니다. – mark4o

1

FD_SET은 루프의 끝 부분에 있으므로 select()에 대한 첫 번째 호출에 비어 있거나 초기화되지 않은 fd_set이있을 수 있습니다. 루프 전에 FD_ZERO(&readSockets)FD_SET(serverSocket, &readSockets)을 사용해야합니다. 또한 select() 호출에서 오류를 확인하는 것이 좋습니다.

+0

네 .. 이미 그걸하고 있어요 ... – aviraldg

+1

'select()'가 오류를 반환하거나 돌아 오지 않습니까? – mark4o

+0

아니요, 오류를 반환하지 않습니다. – aviraldg

0

select()에 의해 반환 된 오류를 확인해야합니다. 당신이 타임 아웃을 사용하는 것 같습니다 때문에, select()도 즉 어떤 소켓 기술자가 준비되지, 0을 반환 할 수

if ((nret = select(nfds, &rset, &wset, &eset, &to)) == SOCKET_ERROR) 
{ 
    // error handling, probably with WSAGetLastError() 
    // ... 
} 

하지만 제한 시간이 만료 : Windows에서이 같은 일 것입니다.