int socket(int domain, int type, int protocol);
필요한 헤더 파일은 아래와 같다
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
여기서 sys/types.h 는 아래의 경우에는 필요하지 않을 수 있다.
POSIX.1-2001 does not require the inclusion of <sys/types.h>, and this header file is not required on Linux. However, some historical (BSD) implementations required this header file, and portable applications are probably wise to include it.
즉, POSIX.1-2001 은 해당 헤더 파일을 필요로 하지 않는다는 것이다. 그러나 과거 BSD 버전에서는 해당 헤더 파일을 필요로 할 수 있다.
1) 역할
socket() creates an endpoint for communication and returns a descriptor.
커뮤니케이션 통신을 위해 end point(단말) 를 만든다.
2) 전달 인자
(1) domain
The domain argument specifies a communication domain; this selects the protocol family which will be used for
즉, 통신 도메인을 설정한다. 커뮤니케이션에 사용될 프로토콜 패밀리를 설정한다.
Domain 의 경우에는 여러가지 값들이 들어갈 수 있는데, 여기서 우리가 쓸 것은 AF_INET 이다.
AF_INET 은 IPv4 인터넷 프로토콜을 의미한다. IPv4 는 현재 우리가 사용하고 있는 IP 주소체계를 생각하면 된다.
링크 : http://www.nxmnpg.com/ko/2/socket http://linux.die.net/man/2/socket
(2) type
which specifies the communication semantics
어떤 방식의 혹은 어떤 의미의 커뮤니케이션을 할 것인지를 명시.
여기서 우리는 두 가지에 집중하면 된다. 하나는 TCP 통신에 사용될 SOCK_STREAM 과 UDP 통신에 사용될 SOCK_DGRAM 이다.
- SOCK_STREAM
순차적이고, 안정적이며(패킷 손실이 발생했을 때 복귀됨), two-way(즉, 두 개의 entity 가 통신)의 연결을 전제로 한(connection based) 바이트 스트림(byte stream) 방식. (byte stream 방식이므로 데이터의 경계가 존재하지 않는다)
- SOCK_DGRAM
위와 상대적으로 커넥션이 전제되지 않고(connectionless), 안정적이지 않은(즉, 패킷 손실이 발생해도 복구되지 않는, unreliable) 최대 길이가 고정된 메세지 형태로 전달되는 방식
(3) protocol
The protocol specifies a particular protocol to be used with the socket. Normally only a single protocol exists to support a particular socket type within a given protocol family, in which case protocol can be specified as 0
소켓에 사용될 구체적인 프로토콜을 명시. 주어진 프로토콜 페밀리(domain) 에서, 주어진 소켓 타입(type) 에 대해서 하나의 프로토콜만 존재하므로, 보통 전달인자는 0 이 된다.
3) 리턴
On success, a file descriptor for the new socket is returned. On error, -1 is returned, and errno is set appropriately.
성공하면, 방금 생성된 소켓에 대한 file descriptor 를 리턴. 에러가 발생했을 경우 -1 리턴
4) 테스트
(1) 리눅스에서 실행. fd_test.c
(2) 결과
이를 통해 3 부터 차례대로 출력되는 것을 알 수 있다. 즉, stdin 은 0, stdout 은 1, stderr 은 2 로 시스템 상에서 자동적으로 할당해 주며, 이후 부터 파일을 open 하거나 socket 을 생성하게 되면 file descriptor 형태로 차례대로 할당해 주게 된다.
링크 : http://linux.die.net/man/2/socket 여길 잘 참조하시길!!
'TCP/IP' 카테고리의 다른 글
Socket 이란? (0) | 2011.11.25 |
---|