Linux/Linux_programing

리눅스 Socket - socket(), sockaddr

sosal 2009. 9. 28. 12:57
반응형
/*
 * made by so_sal
 * http://sosal.tistory.com/
 */

#include<sys/socket.h>
//소켓 관련 헤더

int socket( int __domain, int __type, int __protocol)

domain   ::
AF_INET :: 가장 흔히 사용되는 ARPA 인터넷 프로토콜
AF_UNIX :: 유닉스 내부 프로토콜
AF_ISO   :: 국제 표준 협회 (International Standards Organization) 프로토콜
/usr/include/Linux/socket.h라는 파일에 더 많은 도메인이 있습니다.

대게 AF_INET을 사용합니다.

type ::
SOCK_STREAM :: TCP 기반의 신뢰적, 순차적 양방향 형의 소켓을 사용
SOCK_DGRAM   :: UDP 기반의 접속, 신뢰적이지 않는 접속
SOCK_RAW       :: 내부 네트워크 프토토콜 전용 (super user 전용)
이외에
SOCK_SEQPACKET - AF_NS 프로토콜에서 사용
SOCK_RDM은 구현되지 않습니다.

protocol ::
IPPROTO_TCP :: TCP를 기반으로 하는 소켓을 생성
IPPROTO_UDP :: UDP를 기반으로 하느 소켓을 생성

ex)
int sockfd1,sockfd2;
sockfd1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) //
sockfd2 = socket(AF_INET, SOCK_DGRAM  , IPPROTO_UDP)//

사실 sockfd1의 마지막 인자 IPPROTO_TCP에 0을 넣어도
type SOCK_STREAM에 의해 자동으로 TCP로 연결 됩니다.
sockfd2 역시 마찬가지로 IPPROTO_UDP 대신에 0을 넣어도 됩니다.
socket(AF_INET,SOCK_STREAM,0)
socket(AF_INET,SOCK_DGRAM  ,0)

소켓에 내가 원하는 데이타를 끼워서 상대 컴퓨터와
정보를 주고받을 것입니다.
이 함수는 소켓 프로그래밍에 있어서 가장 중요한 함수이기 떄문에
소켓함수가 하는 역할에 대해서 이해하는 것이 가장 중요합니다.

socket에 write함수로 데이타를 적어서 보내고,
상대방에서 온 socket을 read 함수로 읽으면서
통신을 하게 됩니다.

///////////////////////

소켓 주소 :: sockaddr ::

내부 네트워크 AF_UNIX 도메인에서는
sockaddr_un 이라는 구조체에 주소를 지정합니다.

struct sockaddr_un{
  sa_family_t   sun_family;  // 도메인 AF_UNIX
  char      sun_path[];  // 경로 이름

내부 네트워크 도메인에서 서버 소켓을 찾아가려면,
소켓의 위치를 알아야 하기 때문에, 경로 이름이
주소 구조체 안에 있습니다.

ex)

struct sockaddr_un address;

address.sun_family = AF_UNIX;       // 도메인 지정
strcpy(address.sun_path, "./server_socket"); //현재 위치에 서버소켓이 위치한다면

------------------------

인터넷 프로토콜 AF_INET 도메인에서는
sockaddr_in 이라는 구조체에 주소를 지정합니다

struct sockaddr_in{
  short int         sin_family; // 도메인 (AF_INET)
  struct in_addr      sin_addr; // IP 주소
  unsigned short int    sin_port; // 포트 번호
}

아래 ip주소를 의미하는 구조체 in_addr는
struct in_addr{
  unsigned long int    s_addr;
}

AF_INET 소켓 주소는 도메인과 IP주소, 포트번호로 결정됩니다.

ex)
struct sockaddr_in address;

address.sin_family=AF_INET;
address.sin_addr.s_addr = inet_addr("127.0.0.1");
address.sin_port= 7777;

Socket 게시물들은
begining Linux programing.
Linux 언쉬리드' 를 참고하였습니다.

'Linux > Linux_programing' 카테고리의 다른 글

Socket - 03. Client socket  (2) 2009.10.03
Socket - 02. Server socket  (0) 2009.10.03
리눅스 FILE - open(), close() 시스템콜  (1) 2009.09.28
리눅스 FILE - read() 시스템콜  (1) 2009.09.27
리눅스 FILE - Write() 시스템콜  (1) 2009.09.27