Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

connect(2)

1장. connect(2)

차례
1.1. 사용법
1.2. 설명
1.3. 반환값
1.4. 에러
1.5. 예제
1.6. 참고문헌

소켓에 연결을 시도한다.


1.1. 사용법

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

int  connect(int sockfd, const struct sockaddr *serv_addr,
         socklen_t addrlen);
		


1.2. 설명

sockfd는 socket()함수에 의해서 만들어진 소켓지정자다. SOCK_DGRAM 타입의 소켓일 경우는 보통 connect()를 사용하지 않지만 만약에 사용했다면, serv_addr는 데이터그램을 받을 곳의 유일한 주소값이 된다. 그렇지 않고 SOCK_STREAM, SOCK_SEQPACKET라면 serv_addr에 대한 연결을 만든다. addrlenserv_addr구조체의 크기다.

보통 연결지향 프로토콜 소켓들은 한번에 connect를 한다. 비연결 지향 프로토콜들은 serv_addr타입과 관련된 사항을 바꾸기 위해 여러번 connect를 사용한다. 이러한 과정에서 비 연결 지향 소켓들은 sa_family멤버의 주소를 AF_UNSPEC로 설정하고 연결해서 연결과 관련된 필요없는 사항들을 없앤다.


1.3. 반환값

성공하면 0을 리턴한다. 실패했을 경우는 -1을 리턴하고 적당한 errno를 설정한다.


1.4. 에러

EBADF

파일지정자가 지정자테이블에 있는 유효한 인덱스가 아니다.

EFAULT

소켓 구조체의 주소가 사용자 주소공간 바깥에 있다.

ENOSOCK

파일지정자가 소켓과 관련되어 있지 않다.

EISCONN

이미 연결된 소켓이다.

ECONNREFUSE

원격서버에서 연결을 거부했다. 보통 listen대기열의 공간이 더이상 남아 있지 않았을 때 발생한다.

ETIMEOUT

연결 시도중 타임아웃이 발생했다. 서버가 너무 바쁜 상태이어서 새 연결을 받아들일 수 없을 경우 발생한다.

ENETUNREACH

네트워크에 도달할 수 없다.

EALREADY

소켓이 비봉쇄이고 연결 시도가 아직 완전하지 않다.

EAGAIN

사용 가능한 로컬 포트가 더이상 없거나 라우팅 캐싱에 공간이 충분하지 않다. PF_INET일 때 라우팅 캐싱테이블의 공간을 늘릴리면 ip(7)에 있는 net.ipv4.ip_local_port_range를 참고하라.

EACCES, EPERM

사용자가 소켓 브로드캐스트 플래그를 가능하게 하지 않고 주소를 브로드캐스트 주소에 연결하려고 했거나 방화벽 규칙 때문에 연결요구가 실패했다.


1.5. 예제

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

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


    if ((server_sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror("error :");
        exit(0);
    }

    server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = inet_addr("218.234.19.87");
    serveraddr.sin_port = htons(atoi(argv[1]));

    client_len = sizeof(serveraddr);

    if (connect(server_sockfd, (struct sockaddr *)&serveraddr, client_len) < 0)
    {
        perror("connect error :");
        exit(0);
    }

    memset(buf, 0x00, 80);
    read(0, buf, 80);
    if (write(server_sockfd, buf, 80) <= 0)
    {
        perror("write error : ");
        exit(0);
    }
    memset(buf, 0x00, 80);
    if (read(server_sockfd, buf, 80) <= 0)
    {
        perror("read error : ");
        exit(0);
    }
    close(server_sockfd);
    printf("read : %s", buf);
}
		
서버에 연결해서 메시지를 주고 받는 간단한 echo서버다.