시스템 프로그래밍 - 소켓 프로그래밍
1. 소켓 프로그래밍 함수
1) 소켓 인터페이스 함수
(1) 함수 종류
- socket : 소켓 파일기술자 생성
- bind : 소켓 파일기술자를 지정된 IP주소/포트번호와 결합
- listen : 클라이언트의 접속 요청 대기
- connect : 클라이언트가 서버에 접속 요청
- accept : 클라이언트의 접속 허용
- recv : 데이터 수신 (SOCK_STREAM)
- send : 데이터 송신 (SOCK_STREAM)
- recvfrom : 데이터 수신 (SOCK_DGRAM)
- sendto : 데이터 송신 (SOCK_DGRAM)
- close : 소켓 파일기술자 종료
(2) 소켓 생성하기 : socket
- domain에 지정한 소켓의 형식과 type에 지정한 통신방법을 지원하는 소켓 생성
- 성공 : 소켓 기술자 리턴
- 실패 : -1 리턴
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
- domain : 소켓 종류 (AF_UNIX, AF_INET)
- type : 통신방식 (TCP, UDP)
- protocol : 소켓에 이용할 프로토콜, 보통 0 지정
int sd;
sd = socket(AF_INET, SOCK_STREAM, 0)
(3) 소켓에 이름 지정하기 : bind
- socket함수가 생성한 소켓 기술자 s에 sockaddr구조체인 name지정한 정보 연결
- 성공 : 0
- 실패 : -1리턴
#include <sys/types.h>
#include <sys/socket.h>
int bind(int s, const struct sockaddr *name, int namelen);
- s : socket 함수가 생성한 소켓 기술자
- name : 소켓의 이름을 표현한 기술자
- namelen : 이름의 길이
(4) 클라이언트 연결 기다리기 : listen
#include <sys/types.h>
#include <sys/socket.h>
int listen(int s, int backlog);
- s : socket 함수가 생성한 소켓 기술자
- backlog : 최대 허용 클라이언트 수
- 예 ) 클라이언트 연결 요청 받아들일 준비 마쳤고 최대 10개까지만 받음
(5) 연결 요청 수락하기 : accept(3) - 서버
- 클라이언트 : 연결 요청 수락
- 서버 : 소켓s를 통해 요청한 클라이언트와의 연결을 수락
#include <sys/types.h>
#include <sys/socket.h>
int accept(int s, struct sockaddr *addr, socklen_t *addrlen);
- s : socket함수가 생성한 소켓 기술자
- addr : 접속을 요청한 클라이언트의 IP정보
- addrlen : addr 크기
int sd, new_sd;
struct sockaddr_in sin, clisin;
new_sd = accpet(sd, &clisin, &sizeof(struct sockaddr_in));
(6) 서버와 연결하기 : connect(3) - 클라이언트
- 클라이언트가 서버에 연결 요청시 사용
- 성공 : 0
- 실패 : -1
#include <sys/types.h>
#include <sys/socket.h>
int connet(int s, const struct sockaddr *name, int namelen);
- s: socket 함수가 생성한 소켓 기술자
- name : 접속하려는 서버의 IP정보
- namelen : name의 크기
(7) 데이터 보내기 : send(3)
- 소켓 s를 통해 크기가 len인 메세지 msg를 flags에 지정한 방법으로 전송
- 성공 : 실제로 전송한 데이터의 바이트 수 리턴
- 실패 : -1
#include <sys/types.h>
#include <sys/socket.h>
int send(int s, const void *msg, size_t len, int flafs);
(7-1) flages
- MSG_OOB : 영역밖의 데이터 처리, SOCK_STREAM에서만 사용
- MSG_DONTROUTE : 데이터의 라우팅 설정을 해제
(8) 데이터 받기 : recv(3)
- 소켓 s를 통해 전송받은 메세지를 크기가 len인 buf에 저장
#include <sys/types.h>
#include <sys/socket.h>
ssize_t(int s,void *buf,size_t len, int flags);
(9) UDP 데이터 보내기 : sendto(3)
- UDP 프로토콜 활용 데이터 전송 함수
- 매번 목적지 주소 지정 필요
#include <sys/types.h>
#include <sys/socket.h>
ssize_t sentto(int s, const void *msg, size_t len, int flags,
const struct sockaddr *to, int tolen);
- s : socket 함수가 생성한 소켓 기술자
- msg : 전송할 메세지를 저장한 메모리 주소
- len : 메모리의 크기
- flags: 데이터를 주고받는 방법을 지정한 플래그
- to : 메세지를 받을 호스트의 주소
- tolen : to의 크기
(10) UDP 데이터 받기 : recvfrom(3)
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recvfrom(int s, void *buf, size_t len, int flags,
struct sockaddr *from,int *fromlen);
- flags: 데이터를 주고받는 방법을 지정한 플래그
- from : 메세지를 보내는 호스트의 주소
- fromlen : from의 크기
댓글남기기