LPFN_TRANSMITPACKETS 콜백 함수(mswsock.h)
TransmitPackets 함수는 연결된 소켓을 통해 메모리 내 데이터 또는 파일 데이터를 전송합니다. TransmissionPackets 함수는 운영 체제 캐시 관리자를 사용하여 파일 데이터를 검색하고 전송에 필요한 최소 시간 동안 메모리를 잠그고 효율적인 고성능 전송을 생성합니다.
구문
LPFN_TRANSMITPACKETS LpfnTransmitpackets;
BOOL LpfnTransmitpackets(
SOCKET hSocket,
LPTRANSMIT_PACKETS_ELEMENT lpPacketArray,
DWORD nElementCount,
DWORD nSendSize,
LPOVERLAPPED lpOverlapped,
DWORD dwFlags
)
{...}
매개 변수
hSocket
전송에 사용할 연결된 소켓에 대한 핸들입니다. 소켓이 연결 지향 회로일 필요는 없지만 연결, WSAConnect, accept, WSAAccept, AcceptEx 또는 WSAJoinLeaf 함수를 사용하여 기본 대상/피어를 설정해야 합니다.
lpPacketArray
전송할 데이터를 설명하는 TRANSMIT_PACKETS_ELEMENT 형식의 배열입니다.
nElementCount
lpPacketArray의 요소 수입니다.
nSendSize
보내기 작업에 사용되는 데이터 블록의 크기(바이트)입니다. nSendSize를 0으로 설정하여 소켓 계층이 기본 송신 크기를 선택할 수 있도록 합니다.
nSendSize를 0xFFFFFFF 설정하면 호출자는 lpPacketArray 매개 변수에서 가리키는 TRANSMIT_PACKETS_ELEMENT 배열의 TP_ELEMENT_EOP 플래그를 사용하여 각 송신 요청의 크기와 콘텐츠를 제어할 수 있습니다. 이 기능은 개별 송신 요청의 크기에 제한을 두는 메시지 프로토콜에 유용합니다.
lpOverlapped
OVERLAPPED 구조에 대한 포인터입니다. hSocket 매개 변수에 지정된 소켓 핸들이 겹치는 것으로 열려 있는 경우 이 매개 변수를 사용하여 비동기(겹치는) I/O 작업을 수행합니다. 소켓 핸들은 기본적으로 겹치는 대로 열립니다.
dwFlags
TransmitPackets 함수의 처리를 사용자 지정하는 데 사용되는 플래그 집합입니다. 다음 표에서는 dwFlags 매개 변수의 사용을 간략하게 설명합니다.
값 | 의미 |
---|---|
|
전송을 위해 모든 파일 데이터가 큐에 대기된 후 전송 수준 연결 끊기를 시작합니다. 연결 지향 소켓에만 적용됩니다. 연결 끊기 의미 체계(예: 데이터그램 소켓)를 지원하지 않는 소켓에 대해 이 플래그를 지정하면 오류가 발생합니다. |
|
재사용할 소켓 핸들을 준비합니다. TransmitPackets 함수가 완료되면 소켓 핸들을 AcceptEx 함수에 전달할 수 있습니다. 연결 지향 소켓 및 TF_DISCONNECT 지정된 경우에만 유효합니다.
참고 소켓 수준 패킷 전송에는 기본 전송의 동작이 적용됩니다. 예를 들어 TCP 소켓에는 TCP TIME_WAIT 상태가 적용되어 TransmitPackets 호출이 지연될 수 있습니다.
|
|
Winsock에 시스템의 기본 스레드를 사용하여 긴 TransmitPackets 요청을 처리하도록 지시합니다. 긴 TransmitPackets 요청은 파일 또는 캐시에서 하나 이상의 읽기가 필요한 요청으로 정의됩니다. 따라서 긴 요청 정의는 파일의 크기와 송신 패킷의 지정된 길이에 따라 달라집니다.
다음 레지스트리 매개 변수를 사용하여 시스템 기본 스레드를 REG_DWORD:HKEY_LOCAL_MACHINE\CurrentControlSet\Services\AFD\매개 변수\전송작업자로 조정할 수 있습니다. |
|
Winsock에 시스템 스레드를 사용하여 긴 TransmitPackets 요청을 처리하도록 지시합니다. 긴 TransmitPackets 요청은 파일 또는 캐시에서 하나 이상의 읽기가 필요한 요청으로 정의됩니다. 따라서 긴 요청 정의는 파일의 크기와 송신 패킷의 지정된 길이에 따라 달라집니다. |
|
Winsock이 작업자 스레드 대신 커널 APC(비동기 프로시저 호출 )를 사용하여 긴 TransmitPackets 요청을 처리하도록 지시합니다. 긴 TransmitPackets 요청은 파일 또는 캐시에서 하나 이상의 읽기가 필요한 요청으로 정의됩니다. 따라서 긴 요청 정의는 파일의 크기와 송신 패킷의 지정된 길이에 따라 달라집니다. 자세한 내용은 설명 부분을 참조하십시오. |
반환 값
TransmitPackets 함수가 성공하면 반환 값은 TRUE입니다. 그렇지 않으면 반환 값이 FALSE입니다. 확장 오류 정보를 얻으려면 WSAGetLastError를 호출합니다. WSA_IO_PENDING 또는 ERROR_IO_PENDING 오류 코드는 겹치는 작업이 성공적으로 시작되었으며 나중에 완료가 표시됨을 나타냅니다. 다른 오류 코드는 겹치는 작업이 성공적으로 시작되지 않았으며 완료 표시가 발생하지 않음을 나타냅니다. 이 경우 애플리케이션은 ERROR_IO_PENDING 또는 WSA_IO_PENDING 처리해야 합니다.
반환 코드 | 설명 |
---|---|
호스트 컴퓨터의 소프트웨어에 의해 설정된 연결이 중단되었습니다. 이 오류는 시간 제한 또는 기타 오류로 인해 가상 회로가 종료된 경우 반환됩니다. | |
현재 연결은 원격 호스트에 의해 강제로 끊겼습니다. 이 오류는 원격 쪽에서 가상 회로를 다시 설정할 때 스트림 소켓에 대해 반환됩니다. 더 이상 소켓을 사용할 수 없으므로 응용 프로그램이 소켓을 닫아야 합니다. | |
시스템이 호출에서 포인터 인수를 사용하려는 시도에서 잘못된 포인터 주소를 발견했습니다. lpPacketArray 또는 lpOverlapped 매개 변수가 사용자 주소 공간의 유효한 부분에 완전히 포함되지 않은 경우 이 오류가 반환됩니다. | |
잘못된 인수가 지정되었습니다. dwFlags 매개 변수에 TF_REUSE_SOCKET 플래그가 설정되어 있지만 TF_DISCONNECT 플래그가 설정되지 않은 경우 이 오류가 반환됩니다. lpOverlapped에서 가리키는 OVERLAPPED 구조체에 지정된 오프셋이 파일 내에 없는 경우에도 이 오류가 반환됩니다. 전송할 총 바이트 수가 2,147,483,646보다 큰 값이고 32비트 정수에서 1을 뺀 값인 경우에도 이 오류가 반환됩니다. | |
소켓 작업에 데드 네트워크가 발생했습니다. 이 오류는 네트워크 하위 시스템이 실패한 경우 반환됩니다. | |
해당 작업이 진행되는 동안 오류가 발생하여 연결이 끊겼습니다. 이 오류는 오류를 감지하는 유지 활동으로 인해 연결이 끊어진 스트림 소켓에 대해 반환됩니다. | |
시스템에 충분한 버퍼 공간이 부족하거나 큐가 가득 차서 소켓에서 작업을 수행할 수 없습니다. 이 오류는 Windows 소켓 공급자가 버퍼 교착 상태를 보고하는 경우에도 반환됩니다. | |
소켓이 연결되지 않았기 때문에 데이터를 보내거나 받는 요청이 허용되지 않았습니다. 이 오류는 스트림 소켓에 대해 반환됩니다. | |
소켓이 아닌 항목에서 작업을 시도했습니다. hSocket 매개 변수가 소켓이 아닌 경우 이 오류가 반환됩니다. | |
이전의 종료 호출로 그 방향에서 이미 소켓이 종료되었기 때문에 데이터 보내기 또는 받기 요청이 허용되지 않습니다. 이 오류는 전송을 위해 스트림 소켓이 종료된 경우 반환됩니다. 매개 변수가 SD_SEND 또는 SD_BOTH 설정된 방법을 사용하여 소켓에서 종료 함수가 호출된 후에는 스트림 소켓에서 TransmitFile을 호출할 수 없습니다. | |
애플리케이션이 WSAStartup 함수를 호출하지 않았거나 WSAStartup 이 실패했습니다. TransmitFile 함수를 사용하기 전에 성공적인 WSAStartup 호출이 발생해야 합니다. | |
겹치는 I/O 작업이 진행 중입니다. 겹치는 I/O 작업이 성공적으로 시작되고 나중에 완료가 표시됨을 나타내는 경우 이 값이 반환됩니다. | |
스레드 종료 또는 애플리케이션 요청으로 인해 I/O 작업이 중단되었습니다. 이 오류는 소켓의 닫기, WSAIoctl의 "SIO_FLUSH" 명령 실행 또는 작업이 완료되기 전에 겹친 요청을 시작한 스레드로 인해 겹친 작업이 취소된 경우 반환됩니다.
참고 지정된 스레드에서 시작한 모든 I/O는 해당 스레드가 종료될 때 취소됩니다. 겹치는 소켓의 경우 비동기 작업이 완료되기 전에 스레드가 닫히면 보류 중인 비동기 작업이 실패할 수 있습니다. 자세한 내용은 ExitThread를 참조하세요.
|
설명
TransmitPackets 함수는 사용되는 운영 체제에 따라 최적화됩니다.
- Windows 서버 버전에서 TransmitPackets 함수는 고성능에 최적화되어 있습니다.
- Windows 클라이언트 버전에서 TransmitPackets 함수는 최소 메모리 및 리소스 사용률에 최적화되어 있습니다.
TransmitPackets 함수에 대한 단일 호출을 사용하여 전송할 수 있는 최대 바이트 수는 2,147,483,646이며, 32비트 정수의 최대값은 1을 뺀 값입니다. 애플리케이션이 2,147,483,646바이트보다 큰 데이터를 전송해야 하는 경우 2,147,483,646바이트 이하를 전송하는 각 호출과 함께 TransmitPackets 함수에 대한 여러 호출을 사용할 수 있습니다.
Windows Server 2003에서 TransmitPackets 함수를 사용할 때 더 나은 성능 결과를 기대합니다.
lpOverlapped가 NULL이 아닌 경우 겹치는 I/O는 TransmitPackets 함수가 반환되기 전에 완료되지 않을 수 있습니다. 이 경우 TransmitPackets 함수가 반환되지 않고 WSAGetLastError 함수를 호출하면 ERROR_IO_PENDING 반환되므로 전송이 완료되는 동안 호출자가 처리를 계속할 수 있습니다.
TransmitPackets 및 APC(비동기 프로시저 호출)
TF_USE_KERNEL_APC 플래그를 사용하면 상당한 성능 이점을 제공할 수 있습니다. TransmitPackets 함수 호출을 시작하는 스레드가 무거운 계산에 사용되는 경우 해당 APC가 시작되지 않도록 방지할 수 있습니다.
- 스레드가 대기 상태일 때 커널 APC가 시작됩니다.
- 스레드가 경고 대기 상태일 때 사용자 모드 APC가 시작됩니다.
Windows 8.1 및 Windows Server 2012 R2: 이 함수는 Windows 8.1, Windows Server 2012 R2 이상에서 Windows 스토어 앱에서 지원됩니다.
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows 8.1, Windows Vista [데스크톱 앱 | UWP 앱] |
지원되는 최소 서버 | Windows Server 2003 [데스크톱 앱 | UWP 앱] |
대상 플랫폼 | Windows |
헤더 | mswsock.h |