반응형
sendto(2)
#include <sys/types.h>
#include <sys/socket.h>
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags
const struct sockaddr *dest_addr, socklen_t addrlen);
datagram 데이터를 송신(전송)합니다. UDP 통신 등과 같은 Connectionless형 Datagram 통신에서 데이터를 송신(전송)합니다. struct sockaddr 구조체는 실제 Address Family의 종류에 따라서 다른 구조를 가집니다. (참조: struct sockaddr - Address Family에 따른 구조체 )
파라미터
sockfd
- SOCK_DGRAM으로 설정된 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에서 접속이 끊겼을 때에 전송되는 데이터
dest_addr
- 전송할 상대 시스템의 socket 주소 정보를 저장할 buffer로 Address Family에 따라 종류가 다릅니다.
addrlen
- dest_addr 구조체의 크기
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 <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define SERVER_PORT 6905
#define SERVER_NAME "job.mydomain.com"
......
struct hostent *he;
struct sockaddr_in server_addr;
int sock;
char buf[2048];
......
if((he = gethostbyname(SERVER_NAME)) == NULL) {
fprintf(stderr, "%s는 등록되지 않은 서버명입니다.\n", SERVER_NAME);
return -1;
}
memset(&server_addr, 0x00, sizeof(struct sockaddr_in));
server_addr.sin_samily = AF_INET;
memcpy(server_addr.sin.sin_addr, he->h_addr, he->h_length);
server_addr.sin_port = htons(SERVER_PORT);
if((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
fprintf(stderr, "Socket 생성 오류: %s\n", strerror(errno));
return -1;
}
if(sendto(sock, buf, 256, 0, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in)) == -1) {
fprintf(stderr, "Connection Error: %s\n", strerror(errno));
close(sock);
return -1;
}
......
see also : Socket 통신과 Socket 응용
반응형
'C언어 header > sys | socket.h' 카테고리의 다른 글
send(2) - 연결된 socket으로 데이터를 전송하는 함수 (0) | 2019.09.29 |
---|---|
recvfrom(2) - datagram data를 읽는 함수 (0) | 2019.09.29 |
recv(2) - 데이터를 수신하는 함수 (0) | 2019.09.29 |
setsockopt(2) - socket의 속성을 설정하는 함수 (0) | 2019.09.29 |
getsockopt(2) - socket에 설정된 속성값을 얻는 함수 (0) | 2019.09.29 |