블로그 이미지

카테고리

Total (16)
Study (11)
TCP/IP (1)
임베디드 보드 (3)
OpenCV (1)
Anroid (1)
Java (1)
자료구조 (0)
Web (1)
그외 공부 (2)
ERROR (1)
Project (1)
Like (1)
Info (3)
Total
Today
Yesterday

달력

« » 2025.5
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

공지사항

최근에 올라온 글

'Study/TCP/IP'에 해당되는 글 1건

  1. 2015.08.15 [열혈강의 1장] 네트워크 프로그래밍과 소켓의 이해

1. 공부 요약


소켓

- 네트워크로 연결된 host들이 데이터를 주고 받을 수 있는 sw도구
- OS가 제공하는 네트워크 연결도구 sw 모듈
- 수신 전용, 송신 전용으로 나뉨

[server]
1. socket생성(통신 매개체 생성)
-> 수락 후에 데이터 송수신 가능(양방향 가능)
-> 생성된 소켓은 OS가 내부적으로 가짐. os가 소켓에 번호 부여.
-> 프로그램이 그 번호를 통해 소켓에 접근함(파일 디스크립터)
2. bind(소켓에 주소(IP, PORT) 할당 및 연결)
3. listen(연결요청 대기 상태로 진입)
4. accept(client 요청 수락)
-> 요청받을 때까지 블로킹,
-> 요청받으면 클라이언트 소켓의 파일 디스크립터를 받아오므로 클라이언트에 데이터 송수신 가능

[client]
1. scoket생성(통신 매개체 생성)
-> IP와 port 서버 소켓에 맞게 초기화
2. connect(서버에 연결 요청)

 

파일 디스크립터
- 저 수준 파일 입출력(OS 제공 함수 기반)
- 표준X -> OS 호환성 X
- 리눅스는 소켓도 파일로 간주하기때문에 저 수준 파일 입출력 함수를 기반으로 소켓기반의 데이터 송수신 가능
- 일련된 파일 디스크립터 정수값을 할당해줌(0,1,2,3,...)
- 프로그램 시작 시 자동 설정되는 파일 디스크립터: 0 표준입력, 1 표준출력, 2 표준에러출력
[파일 열기&닫기]
1. open(인자: 파일 경로, 오픈 모드, 리턴: 파일 디스크립터) : 파일 디스크립터를 이용해 파일 입출력 진행
2. close(인자: 파일 디스크립터)
[파일에 데이터 쓰기&읽기]
1. wirte(파일 디스크립터, 전송할 데이터 버터 주소, 전송할 데이터 바이트 수)
-> 파일 디스크립터가 0이면 모니터로 출력됨, 소켓 파일 디스크립터라면 해당 소켓에 전송
2. read(파일 디스크립터, 읽을 데이터 버터 주소, 읽을 데이터 바이트 수)

 

 

 

2. 실습하면서

리눅스 우분투, 윈7 Visual studio2010로 각각 돌려봤는데

윈7에서 돌려보니 리눅스에서 돌릴 때 보다 신경써야하는 게 몇 가지 있다.
1. windows.h보다 winsock2.h를 먼저 인클루드 해야한다.

-> 반대 시, windows.h 안에 winsock.h 해더를 포함하기 때문에 winsock2.h 와 windows.h가 충돌이 일어나서 에러 발생.

2. 소켓 사용할 프로젝트에서 alt+F7을 눌러 속성페이지를 열고 아래 이미지처럼 ws2_32.lib를 추가해줘야한다.(winsock2.h 사용 위해서)

 

 

3. 소켓이 필요할 때 메모리에 적재하는 WSAStartup 필요

4. 파일 디스크립트가 리눅스에서는 int형으로 리턴됐는데, win7에서는 SOCKET형으로 리턴된다.

-> SOCKET은 UINT_PTR로 정의되어있는데 64비트 32비트 호환 가능한 unsigned int형이다. 또한, 리눅스에서는 소켓도 파일로 여기기 때문에 소켓을 닫을 땐 close()하면 되지만 윈도우에서는 closesocket()를 사용한다.

 

기본적으로 위의 4가지를 주의해야 한다.

 

 

예제는 서버에서 클라이언트로 "Hello World" 문자열을 한 번 전송하고 끝난다.

살짝 수정해서 서버에서 클라이언트로 "Hi client"를 보내면 클라이언트에서 서버로 계속 문자열을 전송할 수 있게 바꿔봤다.

클라이언트에서 end를 입력하면 서버에서 "bye client"를 보내고 통신 종료.

 

 

 

Posted by whfod
, |