sendto

 

sendto 함수는 지정된 주소로 데이터를 전송하는 함수입니다.

 

int sendto (
        SOCKET  
s,
        const char FAR *  
buf,
        int  
len,
        int  
flags,
        const struct sockaddr FAR *  
to,
        int 
 tolen
);

 

Parameters

s
[입력] 소켓의 기술자를 명시합니다.

buf
[입력] 전송될 데이터를 가지고 있는 버퍼

len
[입력] 버퍼 않에 있는 데이터의 길이

flags
[입력] 
함수의 호출이 어떤일을 할지 나타내는 플래그 입니다.

to
[입력] 데이터가 전송될 원격 호스트의 어드레스를 나타냅니다.

tolen
[입력] 
to 매개변수의 크기

Remarks

sendto 함수는 소켓(접속 되었건 접속되지 않았건)에서 데이터를 접속된 상대방으로 전송하는데 사용되는 함수입니다. 메시지 지향 소켓(message-oriented sockets)에서 최대 패킷크기(getsockopt 함수로 SO_MAX_MSG_SIZE 옵션의 값을 얻어내서 최대 크기를 구할 수 있습니다.)를 초과하지 않도록 주의 해야 합니다. 만약 데이터가 전송되기에 너무 크다면, 데이터는 전송되지 않고, WSAEMSGSIZE 에러코드를 발생합니다.

to 매개변수는 소켓의 주소체계(address family)로 된 데이터가 전송될 원격 호스트의 어드레스를 나타냅니다. 물론, 브로드캐스트(broadcast) 또는 멀티캐스트 어드레스(multicast address)도 될 수 있습니다. 브로드캐스트 어드레스를 사용하여 전송할 경우 어플리케이션은 SO_BROADCAST 소켓옵션을 가능하게 하여 getsockopt 함수를 호출해야 합니다. getsockopt 함수를 이용하지 않고, 브로드캐스트 하려 한다면, sendto 함수는 실패로 돌아가고, WSAEACCES 에러코들 발생하게 됩니다. TCP/IP 에서, 어플리케이션은 그룹멤버(group member)가 되지 않고도 특정한 멀티캐스트 어드레스로 데이터를 전송할 수 있습니다.

소켓이 바인드 되지 않은 경우 유일한 값은 로컬 시스템에 의해서 할당되어 집니다. 그런다음 소켓은 바운드 된 것 처럼 마킹 됩니다. 이런 경우 어플리케이션은 로컬 소켓의 이름(name)을 얻기 위해 getsockname 함수를 사용할 수 있습니다.

send 함수의 성공적인 종료가 성공적인 데이터의 전송을 의미하지는 않는다는 점을 명심하세요.

sendto 함수는 일반적으로 접속되지 않은 소켓에 대해서, to 매개변수에 지정된 특정한 상대방 소켓으로 데이터그램을 전송하는데 사용하는 함수입니다. 하지만, 소켓(connectionless sockets : SOCK_DGRAM)이 이전에 특정한 주소로 접속되어 있다 하더라도, to 매개변수는 이전에 명시된 목적지 주소를 무시합니다. 접속지향소켓(connection-oriented socket)의 경우 to 와 tolen 매개변수는 무시되며, sendto 함수는 send 함수와 같은 작동을 하게 됩니다.

flag 매개변수는 소켓에 대해 명시된 옵션 이상의 함수동작에 영향을 미치기 위해서 사용될 수 있습니다. 함수의 의미체계는 소켓옵션 그리고, flag 매개변수에 의해서 결정되어 집니다. flag 매개변수를 이용한 방법의 경우 아래의 값을 OR 비트연산을 취해서 구성되어 집니다.

ValueMeaning
MSG_DONTROUTE
 

데이터는 라우팅 될 수 없음을 나타냅니다. 윈도우즈 소켓 시스템은

 대응하는 소켓옵션과 마찬가지로 이 값을 무시 할 수 있습니다.

MSG_OOB

데이터가 out-of-band 데이터로서 전송될 수 있음을 나타냅니다.

이 플래그는 스트림 소켓과만 사용됩니다.

Return Values

에러가 발생하지 않는다면, send 함수는 전송된 총 데이터 크기를 반환합니다. 비동기 소켓의 경우len 매개변수로 건넨 수치보다 작을 수 있습니다. 에러가 발생한 경우는 SOCKET_ERROR를 반환하고, WSAGetLastError를 이용해서 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED

이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이

없었습니다.

WSAENETDOWN 네트웍 서브 시스템에 에러가 발생했습니다.
WSAEACCES

요청된 주소가 브로트캐스트(broadcast) 주소인데, 적절한

플래그가 셋팅되어 있지 않습니다. 브로드캐스트 어드레스의

사용을 허용하기 위해 SO_BROADCAST 매개변수를 가지고,

setsockopt 함수를 호출 해야 합니다.

WSAEINVAL

알 수 없는 플래그가 사용되었거나, SO_OOBINLINE 옵션을

가능하게 한 상태 에서 MSG_OOB 플래그가 소켓에 대해서

명시되었습니다. 또는 len 매개변수가 0 이거나 0보다 작습니다.

WSAEINTR

블록킹 호출이 WSACancelBlockingCall 함수에서

취소되었습니다.

WSAEINPROGRESS

블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가

콜백 함수를 여전히 처리하고 있습니다.

WSAEFAULT buf 매개변수가 제대로 된 형태가 아닙니다.
WSAENETRESET 연산이 진행되고 있는 도중 접속이 끊겨버렸습니다.
WSAENOBUFS 전송하기 위해 사용할 수 있는 버퍼 공간이 없습니다.
WSAENOTCONN 소켓이 접속된 상태가 아닙니다.
WSAENOTSOCK 기술자(descriptor)가 소켓 기술자가 아닙니다.
WSAEOPNOTSUPP

MSG_OOB 가 명시되었지만, 소켓은 SOCK_STREAM 과 같은

형태의 스트림 형태가 아닙니다.

WSAESHUTDOWN 소켓이 셧다운 되었습니다.
WSAEWOULDBLOCK

소켓이 넌블록킹(비동기)로 마킹되어 있고, 수신 연산이 블록킹

상태입니다.

WSAEMSGSIZE

소켓이 메시지 지향형(message oriented)이고, 메시지의

크기가 허용할 수 있는 최대 크기 보다 큽니다.

WSAEHOSTUNREACH

네트웍 시스템 장애 등에 의해서 원격호스트까지 도달 할 수

없습니다.

WSAECONNABORTED

가상 연결 회로망이 타임아웃이나 다른 실패 때문에 끊어져

버렸습니다.

WSAECONNRESET

가상 회로망이 원격지에서 "hard"나 "abortive" 종료를 수행해서

리셋되었습니다.

WSAEADDRNOTAVAIL

원격지 주소가 올바를 형태가 아닙니다. 예를들어 ADDR_ANY와

 같은 형태는 잘못된 형태입니다.

WSAEAFNOSUPPORT 지정된 어드레스 체계가 이 소켓에서 사용될 수 없습니다.
WSAEDESTADDRREQ 목적지 주소가 필요합니다.
WSAENETUNREACH 웍격 시스템까지 네트웍이 도달할 수 없습니다.
WSAETIMEDOUT

접속이 네트웍 실패나 상대방 시스템의 응답 실패로 인하여 드랍

되어 버렸습니다.

 

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 버젼 1.0 그리고 그이후의 버젼에서 사용가능
Header :
          Win16/32 : winsock.h
          Win32-II : winsock2.h
Import Library :
          Win16 : winsock.lib
          Win32 : wsock32.lib
          Win32-II : ws2_32.lib

 

See Also

overviewrecvrecvfromselectsendsocketWSAAsyncSelectWSAEventSelect

 

 

출처 : DEVPIA 곽용진님 style  APIs

[출처] [Socket] sendto|작성자 임종배

+ Recent posts