Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>
1.3절. 반환값의 내용은 다음과 같이 수정이 되어야 함

'성공 할 경우 보내진 packet 크기 값(byte)을 반환하고 실패했을경우에는 -1을 반환하며, 적당한 errno 값을 설정한다.' <a href="/modules/moniwiki/wiki.php/manSearch?google=none&name=sendto">sendto</a>(2)

1장. sendto(2)

차례
1.1절. 사용법
1.2절. 설명
1.3절. 반환값
1.4절. 에러
1.5절. 예제

소켓을 통해 데이터를 전송한다.


1.1절. 사용법

#include <sys/types.h>

#include <sys/socket.h>

int  sendto(int s, const void *msg, size_t len, int flags,
       const struct sockaddr *to, socklen_t tolen);
		


1.2절. 설명

이함수는 다른 소켓으로 메시지를 보내기 위해서 사용된다. 이 함수는 연결지향소켓(TCP)과 그렇지않은 소켓타입(UDP) 모두에 사용가능하다.

s는 메시지를 보내고자 하는 소켓의 지정자이다.

msg는 보내고자 하는 메시지이며, len는 메시지의 길이이다.

to는 보내고자하는 곳의 주소정보를 가지고 있다. 사실 연결지향이라면 연결된 소켓을 통해서 그냥 쓰기만 하면 됨으로 이 정보는 필요없다(NULL), 그러나 연결지향이 아닌 UDP와 같은 연결일경우 주소구조체를 채워주어야만 제대로 메시지가 전달될 것이다. tolen는 sockaddr 구조체의 크기이다.

flags는 다음중 선택해서 지정할수 있다.

MSG_OOB

oub-of-band data를 이 개념을 지원하는 소켓으로 보낸다.

MSG_DONTROUTE

패킷을 전송하는데 게이트웨이를 사용하지 않고 직접 연결된 네트워크를 통해서 호스트로 보낸다. 이것은 diagnostic 혹은 routing 프로그램에 의해서만 사용한다.

MSG_DONTWAIT

non-blocking을 가능하게 한다.

MSG_NOSIGNAL

다른 한쪽의 소켓의 연결이 끊겼을때, 소켓으로부터 발생하는 스트림상의 SIGPIPE를 보내지 않도록 요구한다. 그러나 EPIPE에러는 여전히 반환된다.


1.3절. 반환값

성공할경우 0을 실패했을경우에는 -1을 반환하며, 적당한 errno 값을 설정한다.


1.4절. 에러

EBADF

s 가 유효한 기술자가 아니다.

ENOTSOCK

s 가 소켓이 아닌 파일일경우

EFAULT

실제하지 않는 사용자 공간주소가 매개변수로 지정되었다.

EINTR

신호발생으로 인하여 인터럽트가 걸렸다.

EPIPE

연결된 소켓이 깨졌다. MSG_NOSIGNAL이 설정되어 있지 않을경우 프로세스는 SIGPIPE신호를 받게 된다.


1.5절. 예제

#include <sys/socket.h>

#include <sys/stat.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
    int server_sockfd, client_sockfd;
    int client_len, n;
    char buf[80];
    struct sockaddr_in clientaddr, serveraddr;

    client_len = sizeof(clientaddr);

    if ((server_sockfd = socket (AF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror("socket error : ");
        exit(0);
    }
    bzero(&serveraddr, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
    serveraddr.sin_port = htons(atoi(argv[1]));

    bind (server_sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
    listen(server_sockfd, 5);

    while(1)
    {
        memset(buf, 0x00, 80);
        client_sockfd = accept(server_sockfd, (struct sockaddr *)&clientaddr,
                            &client_len);

        if ((n = read(client_sockfd, buf, 80)) <= 0)
        {
            close(client_sockfd);
            continue;
        }
        sendto(client_sockfd,(void *)buf, 80, 0,
                        NULL, client_len);
        close(client_sockfd);
    }
}
		
telnet으로 간단하게 테스트할수 있는 echo 서버이다.