sendto 함수(winsock.h)

sendto 함수는 특정 대상으로 데이터를 보냅니다.

구문

int sendto(
  [in] SOCKET         s,
  [in] const char     *buf,
  [in] int            len,
  [in] int            flags,
  [in] const sockaddr *to,
  [in] int            tolen
);

매개 변수

[in] s

(연결 가능) 소켓을 식별하는 설명자입니다.

[in] buf

전송할 데이터를 포함하는 버퍼에 대한 포인터입니다.

[in] len

buf 매개 변수가 가리키는 데이터의 길이(바이트)입니다.

[in] flags

호출을 수행하는 방법을 지정하는 플래그 집합입니다.

[in] to

대상 소켓의 주소를 포함하는 sockaddr 구조체에 대한 선택적 포인터입니다.

[in] tolen

to 매개 변수 가 가리키는 주소의 크기(바이트)입니다.

반환 값

오류가 발생하지 않으면 sendto 는 전송된 총 바이트 수를 반환하며, 이는 len이 나타내는 수보다 작을 수 있습니다. 그렇지 않으면 SOCKET_ERROR 값이 반환되고 WSAGetLastError를 호출하여 특정 오류 코드를 검색할 수 있습니다.

오류 코드 의미
WSANOTINITIALISED
이 함수를 사용하기 전에 성공적인 WSAStartup 호출이 발생해야 합니다.
WSAENETDOWN
네트워크 하위 시스템이 실패했습니다.
WSAEACCES
요청된 주소는 브로드캐스트 주소이지만 적절한 플래그가 설정되지 않았습니다. 브로드캐스트 주소를 사용할 수 있도록 SO_BROADCAST 매개 변수를 사용하여 setsockopt 를 호출합니다.
WSAEINVAL
알 수 없는 플래그가 지정되었거나 SO_OOBINLINE 사용하도록 설정된 소켓에 대해 MSG_OOB 지정되었습니다.
WSAEINTR
WSACancelBlockingCall을 통해 차단 Windows 소켓 1.1 호출이 취소되었습니다.
WSAEINPROGRESS
차단 Windows 소켓 1.1 호출이 진행 중이거나 서비스 공급자가 여전히 콜백 함수를 처리하고 있습니다.
WSAEFAULT
buf 또는 to 매개 변수가 사용자 주소 공간의 일부가 아니거나 도난당한 매개 변수가 너무 작습니다.
WSAENETRESET
해당 작업이 진행되는 동안 오류가 발생하여 연결이 끊겼습니다.
WSAENOBUFS
사용할 수 있는 버퍼 공간이 없습니다.
WSAENOTCONN
소켓이 연결되지 않았습니다(연결 지향 소켓만 해당).
WSAENOTSOCK
설명자가 소켓이 아닙니다.
WSAEOPNOTSUPP
MSG_OOB 지정되었지만 소켓은 SOCK_STREAM 형식과 같은 스트림 스타일이 아니거나, OOB 데이터가 이 소켓과 연결된 통신 도메인에서 지원되지 않거나, 소켓이 단방향이며 수신 작업만 지원합니다.
WSAESHUTDOWN
소켓이 종료되었습니다. SD_SEND 또는 SD_BOTH 로 설정된 방법을 사용하여 종료가 호출된 후에는 소켓에서 를 보낼 수 없습니다.
WSAEWOULDBLOCK
소켓이 차단 해제로 표시되고 요청된 작업이 차단됩니다.
WSAEMSGSIZE
소켓은 메시지 지향이며 메시지는 기본 전송에서 지원하는 최대값보다 큽습니다.
WSAEHOSTUNREACH
현재 이 호스트에서 원격 호스트에 연결할 수 없습니다.
WSAECONNABORTED
가상 회로가 시간 초과 또는 기타 오류로 인해 종료되었습니다. 더 이상 소켓을 사용할 수 없으므로 응용 프로그램이 소켓을 닫아야 합니다.
WSAECONNRESET
가상 회로가 하드 또는 중단한 닫기를 실행하는 원격 쪽에서 재설정되었습니다. UDP 소켓의 경우 원격 호스트가 이전에 보낸 UDP 데이터그램을 배달할 수 없었고 "포트 연결할 수 없음" ICMP 패킷으로 응답했습니다. 더 이상 소켓을 사용할 수 없으므로 응용 프로그램이 소켓을 닫아야 합니다.
WSAEADDRNOTAVAIL
원격 주소가 유효한 주소가 아닙니다(예: ADDR_ANY).
WSAEAFNOSUPPORT
지정된 패밀리의 주소는 이 소켓에서 사용할 수 없습니다.
WSAEDESTADDRREQ
대상 주소가 필요합니다.
WSAENETUNREACH
현재 이 호스트에서 네트워크에 연결할 수 없습니다.
WSAEHOSTUNREACH
연결할 수 없는 호스트로 소켓 작업을 시도했습니다.
WSAETIMEDOUT
네트워크 오류 또는 다른 쪽 끝의 시스템이 예고 없이 중단되었기 때문에 연결이 끊어졌습니다.

설명

sendto 함수는 소켓에 나가는 데이터를 쓰는 데 사용됩니다. 메시지 지향 소켓의 경우 기본 서브넷의 최대 패킷 크기를 초과하지 않도록 주의해야 합니다. 이 크기는 getsockopt 를 사용하여 소켓 옵션 SO_MAX_MSG_SIZE 값을 검색하여 가져올 수 있습니다. 데이터가 기본 프로토콜을 통해 원자성으로 전달하기에 너무 긴 경우 WSAEMSGSIZE 오류가 반환되고 데이터가 전송되지 않습니다.

to 매개 변수는 브로드캐스트 또는 멀티캐스트 주소를 포함하여 소켓의 주소 패밀리에서 유효한 주소일 수 있습니다. 브로드캐스트 주소로 보내려면 애플리케이션에서 SO_BROADCAST 사용하도록 설정된 setsockopt 를 사용해야 합니다. 그렇지 않으면 오류 코드 WSAEACCESsendto가 실패합니다. TCP/IP의 경우 애플리케이션은 그룹 구성원이 되지 않고 멀티캐스트 주소로 보낼 수 있습니다.

참고 소켓이 열리면 setsockopt 호출이 수행되고 sendto 호출이 수행되면 Windows Sockets는 암시적 바인딩 함수 호출을 수행합니다.
 
소켓이 바인딩되지 않은 경우 고유 값이 시스템에 의해 로컬 연결에 할당되고 소켓이 바인딩된 것으로 표시됩니다. 소켓이 연결된 경우 getsockname 함수를 사용하여 소켓과 연결된 로컬 IP 주소 및 포트를 확인할 수 있습니다.

소켓이 연결되어 있지 않으면
getsockname 함수를 사용하여 소켓과 연결된 로컬 포트 번호를 확인할 수 있지만 반환된 IP 주소는 지정된 프로토콜의 와일드카드 주소로 설정됩니다(예: IPv4의 경우 INADDR_ANY 또는 "0.0.0.0", IPv6의 경우 IN6ADDR_ANY_INIT 또는 "::").

sendto가 성공적으로 완료되었다고 해서 데이터가 성공적으로 전달되었음을 의미하지는 않습니다.

sendto 함수는 일반적으로 연결 없는 소켓에서 to 매개 변수로 식별된 특정 피어 소켓에 데이터그램 보내는 데 사용됩니다. 연결 없는 소켓이 이전에 특정 주소에 연결되었더라도 to 매개 변수는 해당 특정 데이터그램의 대상 주소만 재정의합니다. 연결 지향 소켓에서 totolen 매개 변수는 무시되므로 sendto전송에 해당합니다.

참고sendto와 같은 차단 Winsock 호출을 실행할 때 Winsock은 호출이 완료되기 전에 네트워크 이벤트를 기다려야 할 수 있습니다. Winsock은 이 상황에서 경고 가능한 대기를 수행하며, 동일한 스레드에서 예약된 APC(비동기 프로시저 호출)에 의해 중단될 수 있습니다. 동일한 스레드에서 지속적인 차단 Winsock 호출을 중단한 APC 내에서 또 다른 차단 Winsock 호출을 실행하면 정의되지 않은 동작이 발생하며 Winsock 클라이언트에서 시도해서는 안 됩니다.
 

예제 코드

다음 예제에서는 sendto 함수를 사용하는 방법을 보여 줍니다.
#ifndef UNICODE
#define UNICODE
#endif

#define WIN32_LEAN_AND_MEAN

#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>

// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")

int main()
{

    int iResult;
    WSADATA wsaData;

    SOCKET SendSocket = INVALID_SOCKET;
    sockaddr_in RecvAddr;

    unsigned short Port = 27015;

    char SendBuf[1024];
    int BufLen = 1024;

    //----------------------
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup failed with error: %d\n", iResult);
        return 1;
    }

    //---------------------------------------------
    // Create a socket for sending data
    SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (SendSocket == INVALID_SOCKET) {
        wprintf(L"socket failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //---------------------------------------------
    // Set up the RecvAddr structure with the IP address of
    // the receiver (in this example case "192.168.1.1")
    // and the specified port number.
    RecvAddr.sin_family = AF_INET;
    RecvAddr.sin_port = htons(Port);
    RecvAddr.sin_addr.s_addr = inet_addr("192.168.1.1");

    //---------------------------------------------
    // Send a datagram to the receiver
    wprintf(L"Sending a datagram to the receiver...\n");
    iResult = sendto(SendSocket,
                     SendBuf, BufLen, 0, (SOCKADDR *) & RecvAddr, sizeof (RecvAddr));
    if (iResult == SOCKET_ERROR) {
        wprintf(L"sendto failed with error: %d\n", WSAGetLastError());
        closesocket(SendSocket);
        WSACleanup();
        return 1;
    }
    //---------------------------------------------
    // When the application is finished sending, close the socket.
    wprintf(L"Finished sending. Closing socket.\n");
    iResult = closesocket(SendSocket);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"closesocket failed with error: %d\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //---------------------------------------------
    // Clean up and quit.
    wprintf(L"Exiting.\n");
    WSACleanup();
    return 0;
}


IP를 사용하는 소켓의 경우(버전 4)

브로드캐스트(SOCK_DGRAM만 해당)를 보내려면 to 매개 변수가 가리키는 주소를 생성하여 의도한 포트 번호와 함께 특수 IPv4 주소 INADDR_BROADCAST(Winsock2.h에 정의됨)를 포함할 수 있습니다. to 매개 변수가 가리키는 주소에 INADDR_BROADCAST 주소 및 의도된 포트가 포함된 경우 브로드캐스트는 모든 인터페이스에서 해당 포트로 전송됩니다.

브로드캐스트를 특정 인터페이스에서만 보내야 하는 경우 to 매개 변수 가 가리키는 주소에는 인터페이스 및 의도한 포트에 대한 서브넷 브로드캐스트 주소가 포함되어야 합니다. 예를 들어 서브넷 마스크가 255.255.255.0인 192.168.1.0의 IPv4 네트워크 주소는 서브넷 브로드캐스트 주소 192.168.1.255를 사용합니다.

일반적으로 브로드캐스트 데이터그램이 조각화가 발생할 수 있는 크기를 초과할 수 없습니다. 이는 데이터그램의 데이터 부분(헤더 제외)이 512바이트를 초과해서는 안 됨을 의미합니다.

전송 시스템 내에서 전송할 데이터를 저장할 수 있는 버퍼 공간이 없으면 소켓이 차단 해제 모드에 배치되지 않는 한 sendto 가 차단됩니다. 비 차단, 스트림 지향 소켓에서 기록된 바이트 수는 클라이언트 및 서버 시스템 모두의 버퍼 가용성에 따라 1에서 요청된 길이 사이일 수 있습니다. select, WSAAsyncSelect 또는 WSAEventSelect 함수를 사용하여 더 많은 데이터를 보낼 수 있는 시기를 결정할 수 있습니다.

len이 0인 sendto를 호출하는 것은 허용되며 0을 유효한 값으로 반환합니다. 메시지 지향 소켓의 경우 길이가 0인 전송 데이터그램이 전송됩니다.

flags 매개 변수를 사용하여 연결된 소켓에 대해 지정된 옵션 외에 함수 호출의 동작에 영향을 줄 수 있습니다. 이 함수의 의미 체계는 소켓 옵션 및 flags 매개 변수에 의해 결정됩니다. 후자는 다음 값과 함께 비트 OR 연산자를 사용하여 생성됩니다.

의미
MSG_DONTROUTE 데이터가 라우팅의 대상이 되어서는 안 되도록 지정합니다. Windows 소켓 서비스 공급자는 이 플래그를 무시하도록 선택할 수 있습니다.
MSG_OOB OOB 데이터(SOCK_STREAM 같은 스트림 스타일 소켓만 해당)를 보냅니다.
 

Windows Phone 8: 이 함수는 Windows Phone 8 이상에서 Windows Phone 스토어 앱에서 지원됩니다.

Windows 8.1Windows Server 2012 R2: 이 함수는 Windows 8.1, Windows Server 2012 R2 이상의 Windows 스토어 앱에서 지원됩니다.

요구 사항

   
지원되는 최소 클라이언트 Windows 8.1, Windows Vista [데스크톱 앱 | UWP 앱]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱 | UWP 앱]
대상 플랫폼 Windows
헤더 winsock.h(Winsock2.h 포함)
라이브러리 Ws2_32.lib
DLL Ws2_32.dll

추가 정보

WSAAsyncSelect

WSAEventSelect

Winsock 함수

Winsock 참조

Recv

recvfrom

선택

send

socket