wsagetlasterror 예제

 

SOCKET 형식이 서명되지 않은 경우 UNIX 환경에서 기존 소스 코드를 컴파일하면 서명/서명되지 않은 데이터 형식 불일치에 대한 컴파일러 경고가 발생할 수 있습니다. 이 코드에서는 보내고 받는 바이트 수를 추적하는 데 두 개의 정수가 사용됩니다. send() 및 recv() 함수는 각각 보내거나 받은 바이트 수의 정수 값 또는 오류를 반환합니다. 또한 각 함수는 활성 소켓, char 버퍼 및 송신 또는 수신할 바이트 수와 사용할 플래그와 같은 매개 변수를 사용합니다. 사용자 데이터그램 프로토콜(UDP)과 같이 연결되지 않은 소켓에 recvfrom() 및 sendto() 함수를 사용합니다. 다음은 클라이언트 및 서버 프로그램 예제에 대한 데이터를 완전히 보내고, 받고, 읽는 것입니다. 첫째로 우리는 연결을 듣고 서버 프로그램을 실행합니다. 연결없는 소켓(예: SOCK_DGRAM 유형)의 경우 connect()에서 수행하는 작업은 후속 send()/WSASend() 및 recv()/WSARecv() 호출에 사용할 수 있는 기본 대상 주소를 설정하는 것입니다. 지정된 대상 주소 이외의 주소에서 수신된 모든 데이터그램은 삭제됩니다. 이름으로 지정된 구조의 주소 멤버가 모두 0이면 소켓의 연결이 끊어집니다. 그런 다음 기본 원격 주소가 확정되지 않으므로 send()/WSASend() 및 recv()/WSARecv() 호출은 오류 코드 WSAENOTCONN을 반환합니다.

그러나 sendto()/WSASendTo() 및 recvfrom()/WSARecvFrom()는 여전히 사용할 수 있습니다. 소켓이 이미 연결되어 있더라도 연결을 다시 호출하기만 하면 기본 대상을 변경할 수 있습니다. 이름이 이전 연결과 다른 경우 수신대기 중인 모든 데이터그램은 삭제됩니다. 즉, 예를 들어, socket() 및 accept() 루틴 반환 시 오류를 검사하는 것은 반환 값을 -1과 비교하거나 값이 음수인지(BSD의 일반적인 및 법적 접근 방식 모두)를 확인하여 수행해서는 안 됩니다. 대신 응용 프로그램은 winsock.h에 정의된 매니페스트 상수 INVALID_SOCKET을 사용해야 합니다. 예를 들어 Windows 소켓 구현은 오류의 결과로 WSACleanup()를 호출하지 않고 종료되는 응용 프로그램을 처리할 준비가 되어 있어야 합니다. WSASetBlockingHook() 함수는 MDI(다중 문서 인터페이스) 모델을 사용하는 응용 프로그램과 같은 보다 복잡한 메시지 처리가 필요한 응용 프로그램을 지원하기 위해 제공됩니다. 일반 응용 프로그램 기능을 수행하기 위한 메커니즘이 아닙니다.

특히 사용자 지정 차단 후크 기능에서 발급될 수 있는 유일한 Windows 소켓 API 함수는 WSACancelBlockingCall()으로, 이로 인해 차단 루프가 종료됩니다.