[Socket] send

MFC 2012. 1. 30. 18:31

send

send 함수는 접속되어 있는 상대방 소켓으로 데이터를 보내는 함수입니다.

int send (
SOCKET
s,
const char FAR *
buf,
int
len,
int
flags
);

Parameters
s
[입력] 접속되어 있는 소켓의 기술자(descriptor)를 기술합니다.

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

len
[입력]
buf 안에있는 데이터의 길이

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

Remarks

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

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

전송 시스템에 사용 가능한 버퍼가 없다면, 소켓이 넌블록킹(비동기)모드일 경우를 제외하고 send는 블록합니다. 비동기 스트림 소켓(nonblocking stream oriented sockets)에서 전송된 바이트의 크기는 1부터 요청된 데이터의 길이 사이의 수가 될 수 있습니다. select, WSAAsyncSelect, WSAEventSelect 함수는 한번 데이터를 전송하고 언제 다른 데이터를 보낼 수 있는지를 결정하는데 사용됩니다. 데이터는 아무때나 보낼 수 있는게 아닙니다. 물론 비동기 소켓에서 연속된 send를 사용할 수 있습니다. 하지만, 안정적인 데이터 송수신을 기대 할 수 없죠. 그렇기 때문에 소켓은 데이터를 전송 할 수 있는 상태가 되었을 때 비로소 데이터를 전송해야 합니다.

len 매개변수를 0으로 해서 send 함수를 호출하는 것은 허용되고, 성공적으로 처리됩니다. 이러한 경우에는 send 함수는 0을 리턴합니다. 메시지 지향 소켓(message-oriented sockets)일경우는 0 길이의 데이터그램이 전송되어 집니다.

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

Value Meaning
MSG_DONTROUTE

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

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

MSG_OOB

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

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

Return Values

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

Error Codes

WSANOTINITIALISED

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

없었습니다.

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

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

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

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

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

WSAEINTR

블록킹 호출이 WSACancelBlockingCall 함수에서

취소되었습니다.

WSAEINPROGRESS

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

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

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

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

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

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

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

상태입니다.

WSAEMSGSIZE

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

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

WSAEHOSTUNREACH

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

없습니다.

WSAEINVAL

소켓이 bind 함수에 의해서 바인드 되지 않았거나, 알 수 없는

플래그가 사용되었거나, SO_OOBINLINE 옵션을 가능하게 한

상태 에서 MSG_OOB 플래그가 소켓에 대해서 명시되었습니다.

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

WSAECONNABORTED

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

버렸습니다.

WSAECONNRESET

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

리셋되었습니다.

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

overview, recvfrom, select, sendto, socket, WSAAsyncSelect, WSAEventSelect

출처 : DEVPIA 곽용진님 style APIs

출처 : http://blog.naver.com/sojuchoigo?Redirect=Log&logNo=120021311620

Posted by pkss
,