윈도우 udp 예제

두 소켓 설명자는 I/O. Winsock에 대해 독립적으로 사용할 수 있지만 액세스 제어는 제공하지 않으므로 프로그래머가 일종의 동기화를 적용하는 것은 프로그래머의 결정입니다. 소켓 설명자가 실제 소켓이 아니라 중복되기 때문에 소켓과 관련된 모든 상태 정보는 모든 설명자에서 공통으로 유지됩니다. 예를 들어 설명자 중 하나에 setockopt() 함수에 의해 설정된 모든 소켓 옵션은 이후 모든 설명자에서 getsockopt() 함수를 사용하여 표시됩니다. 프로세스가 중복된 소켓에서 closesocket()을 호출하면 해당 프로세스의 설명자가 할당 해제됩니다. 그러나 기본 소켓은 마지막 남은 설명자에서 closesocket이 호출될 때까지 열려 있습니다. 또한 WSAAsyncSelect() 및 WSAEventSelect()를 사용할 때 공유 소켓에 대한 알림과 관련된 몇 가지 문제에 유의하십시오. 공유 설명자 중 하나를 사용하여 이러한 호출을 실행하면 해당 등록에 사용된 설명자가 무엇이든 관계없이 소켓에 대한 이전 이벤트 등록이 취소됩니다. 예를 들어 공유 소켓은 B를 처리하는 A 및 FD_WRITE 이벤트를 처리하기 위해 FD_READ 이벤트를 제공할 수 없습니다.

두 설명자 모두에 이벤트 알림이 필요한 경우 프로세스 대신 스레드를 사용할 수 있도록 응용 프로그램 디자인을 다시 고려해야 합니다. netstat 명령을 사용하여 udp 서버의 열린 포트를 확인할 수 있습니다. 다음은 Windows CE가 콘솔 응용 프로그램을 지원하지 않으며 UNICODE만 사용한다는 간단한 예입니다. 이 예제의 목적은 Winsock과 관련이 없는 코드를 무단으로 이동하지 않고도 Winsock의 핵심 개념을 가르치는 것입니다. Windows CE용 서비스를 작성하지 않는 한 사용자 인터페이스는 거의 항상 필요합니다. 이렇게 하려면 창 처리기 및 기타 사용자 인터페이스 요소에 대 한 많은 추가 함수를 작성 해야 합니다., 우리가 가르치려는 난독 화 수 있습니다. 또한, 유니코드 대 비 유니코드 Winsock 기능의 딜레마가있다. 송수신 Winsock 함수에 전달된 문자열이 UNICODE 또는 ANSI 문자열인지는 프로그래머가 결정해야 합니다.

Winsock은 유효한 버퍼인 한 전달하는 내용을 신경 쓰지 않습니다. 물론 컴파일러 경고를 무분별하게 하기 위해 버퍼를 입력해야 할 수도 있습니다. UNICODE 문자열을 char*로 캐스팅하는 경우 보낼 바이트 수에 대한 길이 매개 변수를 적절하게 조정해야 한다는 점을 잊지 마십시오. Windows CE에서 전송되거나 수신된 데이터를 표시하려면 다른 모든 Windows 시스템 함수에 UNICODE 문자열이 필요하므로 데이터를 표시할 수 있도록 유니코드인지 여부를 고려해야 합니다. 요약하면, 윈도우 CE는 간단한 Winsock 응용 프로그램을 만들기 위해 더 많은 하우스 키핑이 필요합니다. 제가 물어볼 질문은 “왜 C++가 아닌 C에서 이 프로그램을 작성했습니까?” 입니다. 대답은 간단합니다. 이 프로그램의 요점은 가장 작고 최신 코드를 제공하지 않는 WinSock 프로그래밍의 기본 프레임 워크를 표시하는 것입니다. 그래서 예를 들어 MFC CSocket 클래스로 프로그램을 구현하지 않기로 결정했습니다.

그러나 소스 코드는 여전히 C ++ 컴파일러로 컴파일됩니다. 소켓, 바인딩 및 sendto와 같은 기본 함수의 사용을 보여주고 싶었습니다. 원래 UNIX 시스템에서 소켓 프로그래밍을 배웠고 해당 환경에서 프로그래머가 Windows 프로그래밍에서 유사한 기능을 사용할 수있는 방법을 확인하려고합니다. 이것은 WinSock 프로그래밍 초보자를위한 기본 예제 프로그램입니다, 아마 이미 어쨌든이 모든 물건을 알고 고급 프로그래머를위한 프로그램이 아닙니다. 서버 프로그램의 구문은 timeserv [server_address] 포트입니다. 포트는 서버를 실행할 포트 번호입니다. 낮은 포트 번호가 다른 프로토콜에 할당될 수 있으므로 1023 이상의 포트 번호를 선택하는 것이 좋습니다. 서버_address 매개 변수는 xxx.xxx.xxx.xxx 형식으로 입력된 서버 컴퓨터의 로컬 IP 주소입니다. 이 매개 변수를 생략하면 프로그램이 자동으로 주소를 얻으려고 시도합니다.

대부분의 경우 이에이더넷 카드 및 무선 네트워킹 카드와 같이 네트워크 연결이 두 개 이상인 경우 프로그램이 잘못된 네트워크 연결을 선택할 수 있습니다.