C/TCPIP 소켓 프로그래밍(윤성우 저)

TCP/IP 소켓 프로그래밍 1~5장 함수 복습

꾸준함. 2017. 6. 10. 23:12

[리눅스 소켓 생성 함수]

#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

표준에러: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 소켓 프로그래밍 윤성우 저

반응형