[리눅스 소켓 생성 함수]
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
->성공시 파일 디스크립터, 실패 시 -1 반환
*domain:소켓이 사용할 프로토콜 체계(Protocol Family) 정보 전달
*type:소켓의 데이터 전송방식에 대한 정보 전달
*protocol:두 컴퓨터간 통신에 사용되는 프로토콜 정보 전달
[리눅스 소켓에 주소정보 할당하는 함수]
#include <sys/socket.h>
int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen);
->성공시 0, 실패시 -1 반환
*sockfd:주소정보를(IP와 PORT를) 할당할 소켓의 파일 디스크립터
*myaddr:할당하고자 하는 주소정보를 지니는 구조체 변수의 주소 값
*addrlen:두 번째 인자로 전달된 구조체 변수의 길이정보
[리눅스 소켓을 연결요청이 가능한 상태가 되게 하는 함수]
#include <sys/socket.h>
int listen(int sockfd, int backlog);
->성공시 0, 실패시 -1 반환
*sock:연결요청 대기상태에 두고자 하는 소켓의 파일 디스크립터 전달, 이 함수의 인자로 전달된 디스크립터의 소켓이 서버 소켓(리스닝 소켓)이 된다.
*backlog:연결요청 대기 큐(Queue)의 크기정보 전달, 5가 전달되면 큐의 크기가 5가 되어 클라이언트의 연결요청을 5개까지 대기시킬 수 있다.
[리눅스 연결요청을 수락해주는 함수]
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
->성공시 파일 디스크립터, 실패 시 -1 반환
*sock:서버 소켓의 파일 디스크립터 전달
*addr:연결요청 한 클라이언트의 주소정보를 담을 변수의 주소 값 전달. 함수호출이 완료되면 인자로 전달된 주소의 변수에는 클라이언트의 주소정보가 채워진다
*addrlen:두 번째 매개변수 addr에 전달된 주소의 변수 크기를 바이트 단위로 전달, 단 크기정보를 변수에 저장한 다음에 변수의 주소 값을 전달한다. 그리고 함수호출이 완료되면 크기정보로 채워져 있던 변수에는 클라이언트의 주소정보 길이가 바이트 단위로 계산되어 채워진다.
[리눅스 클라이언트에서 서버로의 연결요청을 하는 함수]
#include <sys/socket.h>
int connect(int sockfd, struct sockaddr *serv_addr, socklen_t addrlen);
->성공 시 0, 실패 시 -1 반환
*sock:클라이언트 소켓의 파일 디스크립터 전달
*servaddr:연결요청 할 서버의 주소정보를 담은 변수의 주소 값 전달
*addrlen:두 번째 매개변수 servaddr에 전달된 주소의 변수 크기를 바이트 단위로 전달
[파일 디스크립터]
파일 디스크립터 |
대상 |
0 |
표준입력:Standard Input |
1 |
표준출력:Standard Output |
2 |
표준에러:Standard Error |
[리눅스 파일 열기 함수]
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *path, int flag);
->성공 시 파일 디스크립터, 실패 시 -1 반환
*path:파일 이름을 나타내는 문자열의 주소 값 전달
*flag::파일의 오픈 모드 정보 전달
[flag에 전달할 수 있는 값과 그 의미]
오픈 모드 |
의미 |
O_CREAT |
필요하면 파일을 생성 |
O_TRUNC |
기존 데이터 전부 삭제 |
O_APPEND |
기존 데이터 보존하고, 뒤에 이어서 저장 |
O_RDONLY |
읽기 전용으로 파일 오픈 |
O_WRONLY |
쓰기 전용으로 파일 오픈 |
O_RDWR |
읽기, 쓰기 겸용으로 파일 오픈 |
[리눅스 파일 닫기 함수]
#include <unistd.h>
int close(int fd);
->성공시 0, 실패 시 -1 반환
*fd:닫고자 하는 파일 또는 소켓의 파일 디스크립터 전달
[리눅스 파일에 데이터 쓰는 함수]
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t nbytes);
*fd:데이터 전송대상을 나타내는 파일 디스크립터 전달
*buf:전송할 데이터가 저장된 버퍼의 주소 값 전달
*nbytes:전송할 데이터의 바이트 수 전달
[리눅스 파일의 데이터 읽는 함수]
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t nbytes);
*fd:데이터 수신대상을 나타내는 파일 디스크립터 전달
*buf::수신한 데이터를 저장할 버퍼의 주소 값 전달
*nbytes:수신할 최대 바이트 수 전달
[윈도우 소켓의 버전을 알리고, 해당 버전을 지원하는 라이브러리의 초기화 작업을 진행하는 함수]
#include <winsock2.h>
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
->성공시 0, 실패 시 0이 아닌 에러코드 값 반환
*wVersionRequested:프로그래머가 사용할 윈속의 버전정보 전달(예를 들어 MAKEWORD(2, 2))
*lpWSAData:WSADATA라는 구조체 변수의 주소 값 전달
[윈도우 초기화된 라이브러리의 해제하는 함수]
#include <winsock2.h>
int WSACleanup(void);
->성공 시 0, 실패 시 SOCKET_ERROR 반환
[윈도우 소켓 생성 함수]
#include <winsock2.h>
SOCKET socket(int af, int type, int protocol);
->성공 시 소켓 핸들, 실패 시 INVALID_SOCKET 반환
*af:소켓이 사용할 프로토콜 체계(Protocol Family) 정보 전달
*type:소켓의 데이터 전송방식에 대한 정보 전달
*protocol:두 컴퓨터간 통신에 사용되는 프로토콜 정보 전달
[윈도우 bind 함수(IP 주소와 PORT번호의 할당 목적)]
#include <winsock2.h>
int bind(SOCKET s, const struct sockaddr *name, int namelen);
->성공 시 0, 실패 시 SOCKET_ERROR 반환
*s:주소정보를(IP와 PORT를) 할당할 소켓의 파일 디스크립터
*name:할당하고자 하는 주소정보를 지니는 구조체 변수의 주소 값
*namelen:두 번째 인자로 전달된 구조체 변수의 길이정보
[윈도우 listen 함수(소켓이 클라이언트 프로그램의 연결요청을 받아들일 수 있는 상태가 되게 하는 것이 목적)]
#include <winsock2.h>
int listen(SOCKET s, int backlog);
->성공 시 0, 실패시 SOCKET_ERROR 반환
*s:연결요청 대기상태에 두고자 하는 소켓의 파일 디스크립터 전달, 이 함수의 인자로 전달된 디스크립터의 소켓이 서버 소켓(리스닝 소켓)이 된다.
*backlog:연결요청 대기 큐(Queue)의 크기정보 전달, 5가 전달되면 큐의 크기가 5가 되어 클라이언트의 연결요청을 5개까지 대기시킬 수 있다.
[윈도우 accept 함수(클라이언트 프로그램에서의 연결요청을 수락)]
#include <winsock2.h>
SOCKET accept(SOCKET s, struct sockaddr *addr, int *addrlen);
->성공 시 소켓 핸들, 실패 시 INVALID_SOCKET 반환
*s:서버 소켓의 파일 디스크립터 전달
*addr:연결요청 한 클라이언트의 주소정보를 담을 변수의 주소 값 전달. 함수호출이 완료되면 인자로 전달된 주소의 변수에는 클라이언트의 주소정보가 채워진다
*addrlen:두 번째 매개변수 addr에 전달된 주소의 변수 크기를 바이트 단위로 전달, 단 크기정보를 변수에 저장한 다음에 변수의 주소 값을 전달한다. 그리고 함수호출이 완료되면 크기정보로 채워져 있던 변수에는 클라이언트의 주소정보 길이가 바이트 단위로 계산되어 채워진다.
[윈도우 connect 함수(클라이언트 프로그램에서 소켓을 기반으로 연결요청)]
#include <winsock2.h>
int connect(SOCKET s, const struct sockaddr *name, int namelen);
->성공 시 0, 실패 시 SOCKET_ERROR 반환
*s:클라이언트 소켓의 파일 디스크립터 전달
*name:연결요청 할 서버의 주소정보를 담은 변수의 주소 값 전달
*namelen:두 번째 매개변수 servaddr에 전달된 주소의 변수 크기를 바이트 단위로 전달
[윈도우 소켓을 닫을 때 호출하는 함수]
#include <winsock2.h>
int closesocket(SOCKET s);
->성공 시 0, 실패 시 SOCKET_ERROR 반환
*리눅스와 달리 윈도우는 파일과 소켓을 별도로 보기 때문에 별도의 함수가 필요하다.
[윈도우 데이터 송신 함수]
#include <winsock2.h>
int send(SOCKET s, const char *buf, int len, int flags);
->성공 시 전송된 바이트 수, 실패 시 SOCKET_ERROR 반환
*s:데이터 전송 대상과의 연결을 의미하는 소켓의 핸들 값 전달
*buf:전송할 데이터를 저장하고 있는 버퍼의 주소 값 전달
*len:전송할 바이트 수 전달
*flags:데이터 전송 시 적용할 다양한 옵션 정보 전달
[윈도우 데이터 수신 함수]
#include <winsock2.h>
int recv(SOCKET s, const char *buf, int len, int flags);
->성공 시 수신한 바이트 수(단 EOF 전송 시 0), 실패 시 SOCKET_ERROR 반환
*s:데이터 수신 대상과의 연결을 의미하는 소켓의 핸들 값 전달
*buf:수신된 데이터를 저장할 버퍼의 주소 값 전달
*len:수신할 수 있는 최대 바이트 수 전달
*flags:데이터 수신 시 적용할 다양한 옵션 정보 전달
[리눅스 문자열로 표현된 IP주소를 32비트 정수형으로 변환해 주는 함수]
#include <arpa/inet.h>
in_addr_t inet_addr(const char *string);
->성공 시 빅 엔디안으로 변환된 32비트 정수 값, 실패 시 INADDR_NONE 반환
[리눅스 문자열 형태의 IP주소를 32비트 정수, 네트워크 바이트 순서로 정렬해서 반환하는 함수]
#include <arpa/inet.h>
int inet_aton(const char *string, struct in_addr *addr)
->성공 시 1(true), 실패 시 0(false) 반환
*string:변환할 IP 주소 정보를 담고 있는 문자열의 주소 값 전달
*addr:변환된 정보를 저장할 in_addr 구조체 변수의 주소 값 전달
[리눅스 네트워크 바이트 순서로 정렬된 정수형 IP주소 정보를 문자열 형태로 변환하는 함수]
#include <arpa/inet.h>
char *inet_ntoa(struct in_addr adr);
->성공 시 변환된 문자열의 주소 값, 실패 시 -1 반환
[윈도우 문자열 형태의 IP 주소를 32비트 정수형으로 변환해주는 함수]
#include <winsock2.h>
INT WSAStringToAddress(LPTSTR AddressString, INT AddressFamily, LPWSAPROTOCOL_INFO lpProtocolInfo, LPSOCKADDR lpAddress, LPINT lpAddressLength);
->성공 시 0, 실패 시 SOCKET_ERROR 반환
*AddressString:IP와 PORT번호를 담고 있는 문자열의 주소 값 전달
*AddressFamily:첫 번째 인자로 전달된 주소정보가 속하는 주소체계 정보전달
*IpProtocolInfo:프로토콜 프로바이더(Provider) 설정, 일반적으로 NULL 전달
*IpAddress:주소정보를 담을 구조체 변수의 주소 값 전달
*IpAddressLength:네 번째 인잘로 전달된 주소 값의 변수 크기를 담고 있는 변수의 주소 값 전달
[윈도우 32비트 정수형을 문자열 형태의 IP 주소로 변환해주는 함수]
#include <winsock2.h>
INT WSAAddressToString(LPSOCKADDR lpsaAddress, DWORD dwAddressLength, LPWSAPROTOCOL_INFO lpProtocolInfo, LPTSTR lpszAddressString, LPDWORD lpdwAddressStringLength);
*lpsaAddress:문자열로 변환할 주소정보를 지니는 구조체 변수의 주소 값 전달
*dwAddressLength:첫 번째 인자로 전달된 구조체 변수의 크기 전달
*lpProtocolInfo:프로토콜 프로바이더(Provider) 설정, 일반적으로 NULL 전달
*lpszAddressString:문자열로 변환된 결과를 저장할 배열의 주소 값 전달
*lpdwAddressStringLength:네 번째 인자로 전달된 주소 값의 배열 크기를 담고 있는 변수의 주소 값 전달
[참고] TCP/IP 소켓 프로그래밍 윤성우 저
'C > TCPIP 소켓 프로그래밍(윤성우 저)' 카테고리의 다른 글
TCP/IP 소켓 프로그래밍 11장 내용 확인문제 (0) | 2017.06.16 |
---|---|
TCP/IP 소켓 프로그래밍 10장 내용 확인문제 (0) | 2017.06.15 |
TCP/IP 소켓 프로그래밍 9장 내용 확인문제 (0) | 2017.06.10 |
TCP/IP 소켓 프로그래밍 8장 내용 확인문제 (0) | 2017.06.06 |
TCP/IP 소켓 프로그래밍 7장 내용 확인문제 (0) | 2017.06.03 |