2010-12-28 5 views
2

두 개의 응용 프로그램 인 콘솔 서버와 창 클라이언트로 구성된 2D 멀티 플레이어 게임을 작성 중입니다. 지금까지 클라이언트는 연결된 클라이언트로 채워지는 FD_SET, 내 게임 객체 포인터 목록 및 다른 것들을 가지고 있습니다. main()에서는 소켓에서 수신 대기를 초기화하고 들어오는 연결을 수락하고 FD_SET 내에 배치하는 세 개의 스레드를 만듭니다. 하나는 객체의 위치, 속도 및 가속을 처리하고 (필요한 경우) 필요한 것으로 플래그 지정하는 것입니다. 클라이언트에서 업데이트해야합니다. 세 번째 스레드는 send() 함수를 사용하여 모든 객체의 업데이트 정보를 전송합니다 (객체 포인터 목록을 반복). 이러한 패킷은 작업 코드, 패킷 크기 & 실제 데이터로 구성됩니다. 클라이언트에서, 올바르게 받아 들여지는 처음 5 바이트 (opcode와 패킷 크기)를 읽음으로써 그것을 파싱하지만, 패킷의 나머지 부분을 읽을 때 (이제는 그 크기를 알기 때문에), 나는 WSAECONNABORTED (오류 코드 10053). 이 오류에 대해 읽었지만 응용 프로그램에서 왜 발생하는지 알 수 없습니다. 어떤 도움을 주시면 감사하겠습니다.recv를 두 번째로 사용할 때 WSAECONNABORTED

답변

0

오류는 시스템이 소켓을 닫았 음을 의미합니다. 이는 클라이언트의 연결이 끊어 졌음을 감지했거나 읽는 것보다 많은 데이터를 전송했기 때문일 수 있습니다.

네트워크 프로토콜 용 구문 분석기는 일반적으로 견고성을 높이기 위해 많은 작업이 필요하며 단일 읽기()와 같이 얼마나 많은 데이터를 가져올 지 알 수 없습니다. 당신은 당신이 읽은 첫번째 청크에서 당신의 운영 코드와 패킷 크기보다 더 많은 것을 얻을 수 있습니다, 당신은 심지어 더 작을지도 모릅니다 (예를 들면 운영 코드 만). 당신의 실패 사례에서 이것이 일어나지 않는다는 것을 다시 한번 확인하십시오.

+0

첫 번째 recv()가 정확히 5 바이트를 가져 왔는지 확인했습니다. 첫 번째 recv() 항상 예상대로 작동하지만 두 번째 recv() 항상 10053 오류와 함께 실패합니다. 처음에는 서버가 짧은 시간에 많은 패킷을 펌핑했지만 recv() 함수가 실패하지 않았는지 확인하기 위해 10 초당 하나의 패킷 만 보내도록 변경했습니다. 따라서 문제를 일으킨다. –

관련 문제