티스토리 뷰



* 본 포스팅은 한국소프트웨어진흥원 출처의 리눅스 네트워크 프로그래밍 PDF 파일을 토대로 작성되었습니다.

* 개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있음을 밝힙니다.





TCP 클라이언트 프로그램 작성 절차




1. socket() : 소켓 개설

- 클라이언트는 먼저 socket()으로 소켓을 개설

- TCP 또는 UDP 소켓을을선택하며, TCP의 경우 인자로 SOCK_STREAM을 선택.

- 소켓을 이용한 통신 프로그램에서는 사용할 트랜스포트 프로토콜, 자신의 IP 주소와 프로토콜, 상대방 IP 주소와 포트번호 지정되어야 한다.





2. connect() : 서버에 연결 요청


1
2
3
4
int connect(int socket, const struct sockaddr *addr, int addrlen)
//int socket : 소켓 번호(디스크립터)
//const struct sockaddr *addr : 상대방 서버의 소켓서버 구조체
//int addrlen : 구조체 *addr의 크기
 

○ 3-way 핸드쉐이크(연결 수립 확인)이 성공하여 서버와 연결되면 connect()는 0을 리턴

실패시 -1 을 리턴, 에러코드가 전역변수 errno에 들어간다.

○ 서버는 connect()의 요청을 감지하기 위해 listen(), accept()가 호출되어어있어야 한다.





3. close() : 소켓 닫기

- 소켓 번호를 지정하여 close()를 호출, 소켓을 닫을 수 있다.

- 클라이언트, 서버 중 누구나 먼저 호출이 가능

- close() 호출 시 송신 버퍼 혹은 전송 중인 데이터가 있다면 모든 데이터를 전달 후 연결이 종료

(소켓 옵션을 변경하여 미전송된 데이터를 버리고 전송 할 수도 있다.)







데이터 송수신 함수들


※ 클라이언트가 send(), recv() 또는 write(), read()를 통해 서버와 데이터를 송수신 한다.



○ send(), write()

- 스트림 형태의 소켓을 통하여 데이터를 송신하는 함수

- 인자로 데이터를 전송할 소켓번호(디스크립터), 송신할 데이터의 변수, 데이터 크기를 지정

- send()는 추가로 flags 인자가 있다. (기본 값 0)

- 읽은 데이터는 바이트 단위로 리턴된다.


○ recv(), read()

- 스트림 형태의 소켓을 통하여 데이터를 수신하는 함수

- 인자로 데이터를 수신할 소켓번호(디스크립터), 수신한 데이터가 입력될 변수, 입력받을 크기를 지정

- recv()는 추가로 flags 인자가 있다. (기본 값 0)

- 읽은 데이터는 바이트 단위로 리턴된다.


○ send(), recv()의 flags 인자는 송수신시 특별한 옵션을 지정할 때 사용한다.


○ TCP 소켓에서 write() 혹은 send() 실행 시

1. 데이터가 TCP 계층의 송신 버퍼로 들어감

2. 송신 버퍼가 비어있지 않아 데이터를 입력할 수 없으면 write() 문에서 대기

3. write()에서 대기 중 버퍼의 데이터가 송신된다면 write()에서 대기하던 데이터가 버퍼로 전송

4. write()문이 리턴되었다는 것은 데이터가 TCP의 송신 버퍼로 넘어 갔다는 것을 의미



공유하기 링크
태그 클라우드
, , , ,
프로필사진

Yowu (Yu Yongwoo)

흔한 백엔드 개발자입니다
우분투 데스크탑 개발 환경을 선호합니다
최근에는 vscode에 neovim 모드 올려서 쓰고 있습니다
개발용 키보드는 역시 해피해킹 프로2 무각입니다
락 밴드에서 드럼을 쳤습니다

«   2020/01   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
글 보관함
Total
2,615,847
Today
43
Yesterday
772