-
리눅스기반 소켓프로그래밍_기본적인 함수설명CS/Linux 2024. 4. 28. 17:48반응형
소켓이란?
- 소켓은 데이터의 송수신 방법으로 소켓을 통해서 컴퓨터간 데이터를 주고 받을 수 있다.
파일 디스크립터
-할당 받은 파일또는 소켓에 부여되는 정수를 의미한다.
0: 표준 입력
1: 표준 출력
2: 펴준 에러
소켓 함수의 소개
1) 서버
#include <sys/socket.h>
c언어에서 소켓 프로그래밍을 위한 헤더파일이다.
int socket(int domain, int type, int protocol)
-소켓을 생성하는 함수, 성공시 파일 디스크립터, 실패시 -1을 반환한다.
domain: 소켓이 사용할 프로토콜 체계 정보전달
type: 소켓의 데이터 전송방식에 대한 정보전달
-tcp 방식은 SOCK_STREAM udp 방식은 SOCK_DGRAM을 사용한다.
protocol: 두 컴퓨터간 통신에 사용되는 프로토콜 정보 전달, 주로 0으로 두지만 한가지 프로토콜에서 두가지 프로토콜로 나뉘는 경우처럼 특수한 경우에 사용해줘야한다. 0으로 둘경우 알아서 설정해준다.
- IPPROTO_TCP, IPPROTO_UDP
int bind()
-생성한 소켓에 IP와 포트번호 주소정보를 등록한다. 성공시 0 실패시 -1반환
int listen(int sockfd, int backlog)
- 소켓이 연결가능한 상태가 된다. 성공시 0 실패시 -1반환
int accpet(int socketfd, struct sockaddr *addr, socklen_t *addrlen)
- 클라이언틀부터 소켓 연결 요청을 수락하는 함수이다.
- 성공시 파일 디스크립터 , 실패시 -1을 반환한다.
2)클라이언트
int connect(int sockfd, struct sockaddr *serv_addr, socklen_t addlen)
-소켓을 대상으로 호출하는 함수
주소표현을 위한 구조체
sockaddr_in{
sa_family_t sin_family // 주소체계
uint16_t sin_port // 16비트 tcp/udp port번호
struct in_addr sin_addr //32비트 IP주소
char sin_zero[8] 사용되지 않음
}
struct in_addr{
in_addr_t s_addr; //32비트 IPv4 인터넷 주소
}
sin_family
AF_INET: IPv4
AF_INET6: IPv6
네트워크 바이트 순서변환함수
빅엔디안 리틀 엔디안 이슈로 변환해주어야 한다. 네트워크 전송에서는 빅에디안 방식을 하용한다ㅣ.
htons()
ntohs()
IP주소를 네트워크 바이트 순서로 변환해주는 함수
inet_addr //성공시 32 비트 정수값 실패시 INADDR_NONE
inet_aton //구조체에 따로 정의할 필요없이 자동으로 변환한 주소값을 구조체에 정의해줌
inet_ntoa //반대의 기능을 제공한다. 바이트 주소를 IP주소로 변환해줌
인터넷 주소의 초기화 방법
struct sockaddr_in addr;
char *serv_ip ="";
char *serv_port = "prot"
memset(&addr , 0 ,sizeof(addr)); // 바이트 초기화 함수
addr.sin_family = AF_INET;
addr.sin_addr.s_addr=inet_addr(serv_ip); or addr.sin_addr.s_addr=htonl(INADDR_ANY); // 소켓이 동작하는 컴퓨터의 IP주소를 자동으로 할당
addr_sin_port=htons(atoi(serv_port))
bind 과정
socket()를 통해 소켓을 생성하고 addr_in 구조체에 주소정보를 할당했으면 이제는 bind()함수를 통해 소켓에다가 주소정보를 할당해야한다.
int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen);
sockfd: 주소정보를 할당할 소켓의 파일 디스크립터
myaddr: 주소정보를 가지고 있는 구조체 변수 주소의 값
addrlen: 두 번째 인자로 전달된 구조체 변수의 길이정보
예시) 소켓 생성과 초기화 그리고 주소정보 할당, 이는 기본적인 서버의 소켓 개발 과정이다.
int serv_sock; struct sockaddr_in serv_addr; char *serv_port = "9190"; //서버 소켓 생성 serv_sock = socket(PF_INET, SOCK_STREAM, 0); //PF_INET은 IPv4로 SOCK_STREAM은 TCP 소켓 타입으로 하겠다는 뜻이다. //주소정보 초기화 memset(&serv_addr, 0 ,sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); serv_addr.sin_port=htons(atoi(serv_port); //주소정보 할당 bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
반응형'CS > Linux' 카테고리의 다른 글
리눅스 소켓프로그래밍- 멀티세션 구현을 위한 스레드 (2) 2024.05.07 리눅스 소켓프로그래밍_UDP기반 서버/클라이언트 구현 (0) 2024.04.29 우분투 리눅스 고정 IP주소 할당하기 (0) 2024.04.06 (이것이 우분투 리눅스다)셸 스크립트 프로그래밍 (2) 2024.03.21 (이것이 우분투 리눅스다) 4장. 기본 명령어 (2) 2024.03.21