mfc 동기 소켓 예제

문제는 모든 아키텍처가 작은 엔디안이 아니라는 것입니다. 이 데이터가 nework에서 4바이트로 int로 읽혀지고 SPARC 컴퓨터에서 읽는 경우(“빅 엔디안” 아키텍처의 한 예로) 0x06B50000 값을 볼 수 있으며 메시지 112,525,312바이트길이라고 생각합니다. 스레드 포인터가 스레드 개체에 배치된 여러 장소가 있었으며 사용되지 않았다고 생각하기도 했습니다. 사실, 초기화되었지만 사용되지 않은 무상 변수가 많이 있었지만 전혀 존재하지 않아야합니다! 이들은 모두 제거되었습니다. 소켓이 CWinThread 개체에 액세스해야 할 이유는 없습니다. 이 경우 디자인이 잘못되었습니다. 공개로 선언 된 대부분의 방법은 무상으로 공개되었으며 공개 할 필요가 없었습니다. 틀림없이, 마이크로 소프트는이 잘못을 가지고 있으며, 대체로 여전히 잘못되었습니다. 예를 들어 VS.NET 모든 처리기 메서드는 전혀 의미가 없지만 public으로 선언됩니다. 모든 공용 개체를 검사하여 프로그래머의 편이든 Microsoft편이든 부주의한 프로그래밍의 결과가 아닌지 확인해야 합니다. 스레드에 정보를 전달하는 메커니즘에는 변수가 포함됩니다. 또한 이 글을 쓴 사람이 모든 종류의 스레드 간 동기화에 대해 단서가 없다는 것도 분명합니다.

올바른 프로그램을 작성하는 대신 이 프로그램은 잘못된 것으로 정의되어 가장 최근에 받은 문자열만 보고했습니다. 예제 프로그램은 잘못된 디자인의 잘못된 구현이 아니라 올바른 디자인의 올바른 구현의 모범이 되도록 설계되어야 합니다. 이 프로그램은 디자인 원칙을 위반합니다. 서버 소켓이 특정 포트를 수신 대기하도록 하려면 Listen()를 호출해야 합니다. 호출의 성공 또는 실패를 나타내는 값을 반환합니다. 클라이언트에 대한 연결을 나타내는 소켓을 만든 다음 연결을 기다립니다. 실수라고 가장 잘 설명 할 수 있으며 잘못 될 가능성이 있습니다. 스레드 작성자가 m_Socket이라는 멤버가 있고 pThread라는 멤버가 있다는 것을 알고 있는 이유는 무엇입니까? 소켓 내부에서 스레드를 사용할 수 있고 소켓 내부에서 사용되지 않는 스레드를 사용하는 것은 의미가 없으므로 이 작업을 수행할 근거가 전혀 없는 것 같습니다. 소켓 내부의 CWinThread 개체에 대한 참조가 필요한 이유는 무엇입니까? 이것은 좋은 OO 프로그래밍이 아니며 의미가 없습니다. 필요한 경우 ::GetCurrentThread()) 및 스레드 ID(::GetCurrentThreadId()에서 스레드 핸들을 가져올 수 있습니다. 따라서 CWinThread 개체에 대한 참조가 필요하지 않습니다. 우리는 이미 OnAccept 이벤트를 보았습니다.

이제 OnReceive 및 OnClose을 분석해 보겠습니다. 이러한 이벤트를 받으려면 CMySocket 예제 클래스에서 이미 볼 수 있듯이 CCESocket을 하위 클래스로 분류하고 새 가상 함수를 제공해야 합니다. 여기서 중요한 교훈 중 하나는 강력하고 신뢰할 수 있는 다중 스레드 코드를 작성하기가 어렵고 오후 1시 예제를 벗어날 수 없으며 올바른 것으로 예상할 수 없다는 것입니다. 이 코드가 올바른지 확인하고 문서화하는 데 며칠을 보냈습니다. KB192570의 장난감 예는 장난감입니다. 장난감 트럭을 사용하여 실제 건설 현장에서 바위를 운반하지 않으며 장난감 예제를 사용하여 견고하고 신뢰할 수 있는 멀티스레딩 코드를 작성하지 않습니다. 장난감 트럭에 큰 바위를 처음 넣으면 깨집니다. 장난감 코드에 실제 응용 프로그램을 처음 넣으면 깨집니다.

Share Button
Posted in Uncategorized.