티스토리 뷰
* 본 포스팅은 한국소프트웨어진흥원 출처의 리눅스 네트워크 프로그래밍 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 인자는 송수신시 특별한 옵션을 지정할 때 사용한다.
1. 데이터가 TCP 계층의 송신 버퍼로 들어감
2. 송신 버퍼가 비어있지 않아 데이터를 입력할 수 없으면 write() 문에서 대기
3. write()에서 대기 중 버퍼의 데이터가 송신된다면 write()에서 대기하던 데이터가 버퍼로 전송
4. write()문이 리턴되었다는 것은 데이터가 TCP의 송신 버퍼로 넘어 갔다는 것을 의미
'개인공부 > 소켓 프로그래밍' 카테고리의 다른 글
리눅스 소켓 프로그래밍 09 : TCP 서버 프로그램 예제 (3) | 2014.02.17 |
---|---|
리눅스 소켓 프로그래밍 08 : TCP 서버 작성절차, 함수 (0) | 2014.02.11 |
리눅스 소켓 프로그래밍 07 : TCP 클라이언트 프로그램 예제 (0) | 2014.02.08 |
리눅스 소켓 프로그래밍 05 : IP, 도메인 주소변환 (3) | 2014.02.03 |
리눅스 소켓 프로그래밍 04 : 소켓주소 구조체 (0) | 2014.02.02 |
리눅스 소켓 프로그래밍 03 : 디스크립터 확인 예제 (2) | 2014.02.02 |
리눅스 소켓 프로그래밍 02 : 소켓 socket() 함수 (3) | 2014.02.02 |