네트워크 프로그래밍과 소켓의 이해
2022. 5. 22. 18:01ㆍ네트워크
728x90
통신
- 물리적으로 떨어진 서로 유무선으로 연결된 두 장비들 사이의 데이터 교환을 말함
네트워킹
- 서로 다른 두 장비 간에 데이터 교환을 말함
- 비교적 먼 거리의 데이터 전달이어서 출발지와 목적지 사이에 여러 장비를 거침
- 장비들이 최단 경로를 고려 (라우팅)
- 경로에 따라 데이터 전달은 IP가 담당
- IP주소를 기반으로 동작
네트워크 프로그래밍
- 소켓을 이용한 프로그래밍이기 때문에 소켓 프로그래밍이라고도 함
- 네트워크로 연결된 둘 이상의 컴퓨터 사이에서의 데이터 송수신 프로그램 작성을 의미
소켓
- 네트워크(인터넷) 연결 도구
- OS에 의해 제공되는 소프트웨어 장치
- 응용 프로그램과 운영체제 내 네이터 전송 프로토콜 사이를 연결하는 구조체
- 응용 프로그램에서 소켓 함수를 통해 데이터 전달
- 소켓의 주소정보는 IP와 PORT로 구
윈도우 소켓 헤더 및 라이브러리 설정
- 헤더파일에 winsock2. h 포함
- ws2_32.lib 라이브러리 링크
윈도우 소켓(winsock) 초기화
- 윈도우소켓 프로그래밍을 할 때에는 반드시 WSAStartup 함수를 호출하여 초기화 작업을 진행해야함
#include <winsock2.h>
int WSAStartup(WORK wVersionRequested, LPWSADATA lpwSAData);
- 성공시 0, 실패시 에러코드 값 반환
- wVersionRequested : 프로그래머가 사용할 윈속의 버전 정보
- lpWSAData: WSADATA 구조체 변수 주소값
- 사용 예시
#include <winsock2.h> int main(void) { WSADATA wsaData; // MAKEWORD(2, 2) : 주버전 2, 부버전 2, Ox0202 if(WSAStartup(MAKEWORD(2, 2), &wsaData)!=0) { ErrorHandling("WSAStartup() error!"); } ... }
## 주요 구조체
typedef struct WSAData {
WORK wVersion;
WORK wHighVersion;
} WSADATA;
- 윈소켓 구현에 대한 정보
- wVersion : 주버전
- wHighVersion : 부버전
typedef struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; } SOCKADDR_IN, *PSOCKADDR_IN, *LPSOCKADDR_IN;
- 소켓의 주소 정보
- sin_family : 주소 체계
- PF_INET (IPv4 기반)
- PF_INET6 (IPv6 기반)
- sin_port : 포트번호
- 16비트
- 네트워크 바이트 순서(빅 엔디안)로 저장
- sin_addr : 32비트 IP 주소
- 네트워크 바이트 순서(빅 엔디안)로 저장
- sin_zero : 사용 ㄴㄴ
- 그냥 0 넣기
주요 메서드
#include <winsock2.h>
SOCKET socket(int af, int type, int protocol);
- 소켓 생성
- 성공시 소켓 핸들, 실패시 INVALID_SOCKET 반환
- af: Address Family : 소켓이 사용할 프로토콜 체계 정보
- AF_INET : IPv4 인터넷 프로토콜
- AF_INET6 : IPv6 인터넷 프로토콜
- type : 소켓의 데이터 전송 방식에 대한 정보
- SOCK_STREAM
- 연결 지향형 소켓
- TCP 소켓을 할당할 때 사용
- SOCK_DGRAM
- 비 연결 지향형 소켓
- UDP 소켓을 할당할 때 사용
- SOCK_STREAM
- protocol : 두 컴퓨터간 통신에 사용되는 프로토콜 정보
- IPPROTO_HOPOPTS
- 0과 같은 값
- 앞에 type인자값을 기준으로 자동 결정
- IPPROTO_TCP
- 6과 같은 값
- IPPROTO_UDP
- 17과 같은 값
핸들
운영체제가 만든 파일(소켓)을 구분하기 위한 값(식별자)
- 17과 같은 값
- IPPROTO_HOPOPTS
#include <winsock2.h>
int bind(SOCKET s, const struct sockaddr *name, int nameLength);
- 소켓에 주소정보(IP,Port) 할당
- 성공시 소켓 핸들, 실패 시 SOCKET_ERROR 반환
- SOCKET s : 주소 정보를 할당할 소켓
- sockaddr *name : 할당하고자 하는 주소 정보
- int nameLength : 두 번째 파라미터의 길이
#include <winsock2.h>
int listen(SOCKET s, int backlog);
- 소켓이 클라이언트 프로그램의 연결 요청을 받아들일 수 있는 상태로 변환
- 성공시 0, 실패시 SOCKET_ERROR 반환
- SOCKET s : 상태변환을 할 소켓
- backlog : 보류중인 연결 대기열의 최대 길이
#include <winsock2.h>
SOCKET accept(SOCKET s, struct sockaddr *addr, int *addrLength);
- 클라이언트 프로그램과의 연결요청을 수락
- 주로 서버 측에서 사용
- 연결요청이 올때까지 대기
- 성공시 소켓 핸들, 실패 시 INVALID_SOCKET 반환
- SOCKET s : 연결요청을 수락할 소켓
- socketaddr *addr : 연결 요청을 한 클라이언트의 주소 정보
- *addrLength : 연결 요청을 한 클라이언트의 주소정보 길
#include <winsock2.h>
int connect(SOCKET s, const struct sockaddr *name, int nameLen);
- 소켓 기반으로 연결요청
- 주로 클라이언트 측에서 사용
- 성공 시 0, 실패 시 SOCKET_ERROR 반환
- SOCKET s : 연결 요청하는 소켓
- sockaddr *name : 연결 요청할 대상(서버)의 주소정보
- nameLen : 서버의 주소 정보 길이
#include <winsock2.h>
int closesocket(SOCKET s);
- 소켓을 닫음
- 성공시 0, 실패 시 SOCKET_ERROR 반환
#include <winsock2.h>
int WSACleanup(void);
- 윈속 라이브러리를 해제
- 호출 이후에 윈속 관련 함수 호출이 불가능
- 즉, 프로그램 종료 직전에 호출
- 성공시 0, 실패시 에러코드 반환
728x90
'네트워크' 카테고리의 다른 글
소켓의 타입과 프로토콜 설정 (0) | 2022.05.22 |
---|