send(2)

#include <sys/types.h>
#include <sys/socket.h>

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

connect(2), accept(2) 등으로 연결된 socket으로 상대 시스템에 데이터를 전송합니다. flags의 속성이 0이면 일반적인 데이터 전송 방식으로 write(2)함수로 대체할 수 있습니다.

 

 

파라미터

sockfd
    - connect(2), accept(2)로 연결된 socket descriptor
buf
    - 전송할 데이터
len
    - 전송할 데이터 길이
flags
    - 전송할 데이터 또는 읽는 방법에 대한 option. 0 또는 bit or 연산으로 설정가능함

 MSG_DONTROUTE : gateway를 통하지 않고 직접 상대시스템으로 전송
 MSG_DONTWAIT : non blocking에서 사용하는 옵션으로 전송이 block되면 
          EAGIN, EWOULDBLOCK 오류로 바로 return 함.
 MSG_MORE : 더 전송할 데이터가 있음을 설정함.
 MSG_OOB : out of band(긴급데이터) 데이터를 읽습니다. 주로 X.25에서 접속이 끊겼을 때에 전송되는 데이터
      flags의 값이 0이면 일반 데이터를 전송하며, write(sockfd, buf, len)를 호출한 것과 같습니다.

 

RETURN

0 이상
    - 정상적으로 데이터를 전송하였으며, 실제로 전송된 데이터 량을 return합니다.

-1
    - 오류가 발생하였으며, 상세한 오류 내용은 errno에 저장됩니다.

 EACCES   : AF_UNIX에서 사용하는 것으로 권한이 없음
 EAGAIN or EWOULDBLOCK : time out이 발생하였거나 socket에 non-blocking이 설정된 경우
 EBADF    : sockfd가 유효하지 않는 descriptor
 ECONNRESET : peer(상대) 시스템에서 connection이 reset(close)됨.
 EDESTADDRREQ : socket이 connection-based socket이 아님
 EFAULT   : 읽을 데이터를 저장할 buf가 유효하지 않은 메모리인 경우
 EINTR    : signal이 발생하여 interrupted 된 경우
 EINVAL   : 파라미터의 값이 유효하지 않은 경우
 ENOMEM   : 메모리를 사용할 수 없음.
 ENOTCONN : connect(2), accept(2)가 호출되지 않은 상태인 경우
 ENOTSOCK : sockfd가 socket descriptor가 아닌 일반 파일인 경우
 EOPNOTSUPP : flag값이 유효하지 않음
 EPIPE    : local socket이 shutdown 됨.

 


활용 예제

 

Sample

#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>

......

char    buffer[2048];
int     send_len;

......

while( (recv_len = send(sockfd, buffer, 256, 0)) == -1) {
    if(errno == EINTR) { // signal이 발생하여 전송하지 못한 경우
        continue;
    } else {
        fprintf(stderr, "Send Error: %s\n", strerror(errno));
        return -1;
    }
}

......

 


see also : Socket 통신과 Socket 응용

 

 

 

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요