C 언어에서 sendto()는 연결하지 않은 UDP 소켓에서 목적지 IP와 포트를 지정해 데이터그램을 보낼 때 사용한다.
같은 소켓으로 여러 장치에 보낼 수 있다는 점이 편하다.
형태는 ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen) 이다.
UDP 데이터그램 하나는 가능한 경우 통째로 전송되며 일부만 전송되는 TCP 방식과 다르다.
너무 큰 데이터그램은 EMSGSIZE로 실패할 수 있다.
fd는 socket(AF_INET, SOCK_DGRAM, 0) 등으로 만든 UDP 소켓이라는 전제다. 192.168.0.20과 9000은 통신할 실제 장치 주소와 포트로 바꿔야 하며 IP 변환 성공도 검사해야 한다.
/* fd는 이미 만든 IPv4 UDP 소켓이다. */
struct sockaddr_in dst = {0};
dst.sin_family = AF_INET;
dst.sin_port = htons(9000);
if (inet_pton(AF_INET, "192.168.0.20", &dst.sin_addr) != 1) {
fprintf(stderr, "잘못된 IPv4 주소\n");
return 1;
}
const char message[] = "hello";
ssize_t n = sendto(fd, message, sizeof(message) - 1, 0,
(struct sockaddr *)&dst, sizeof(dst));
if (n < 0)
perror("sendto");
sendto()가 성공해도 UDP 특성상 상대방 도착은 보장되지 않는다.
유실, 중복, 순서 변경이 문제가 되는 프로토콜이면 애플리케이션에서 번호와 응답, 재전송을 구현해야 한다.
connect()한 UDP 소켓에서는 send()를 사용하는 편이 간단하다.
답글 달기