티스토리 뷰
#netstat -anu
//현재 서버에서 서비스 중인 tcp 포트 번호 확인
중복되는 port 번호 사용할 수 없음
★ tcp client/server
- 전화와 같은 서비스와 비슷
- 통화(데이터 전달)전에 연결
- 상대방이 데이터를 잘 수신했는지 확인이 가능
- 반드시 연결을 한다 --> 안정적인 데이터 통신 가능
= 안정적이지만 간결하지 않고 복잡하고 udp에 비해 느림
- 대규모 통신에 적합(긴급한 상황)
!식별
-문자를 사용하지 않는다
-파일 식별(아이노드 식별)
-프로세스 #ps -ef
> 각 프로세스마다 고유의 번호를 사용
> 장치 번호가 따로있음
- 장치 식별 ( 장치 번호 )
- 네트워크 식별 ( 숫자, 아이피, 포트 )
TCP는 Client마다 소켓을 하나 두고 관리한다
1. server
1) 소켓 생성
2) bind -> 사용할 포트 번호를 지정
3) listen() -> 수신을 허용할 클라이언트 수를 지정 (동시연결)
listen에 때라서 동시에 허용할 수를 알수 있음
4) accpt() -> 수신 대기(연결요청)
--------전화기를 키는 것------------
5) send, recv
>>sock = socket.socket(): 전송방식 결정
>> sock.bind( ( HOST, PORT )(튜플형태) )
- 생성된 소켓 객체를 통해 사용할 호스트와 사용할 포트번호를 지정
>>sock.listen( 연결최대개수 )
- 생성된 소켓 객체를 통해 연결할 수 있는 최대 갯수
- 서버의 상태를 listen 상태로 전환
>>sock.accept()
- 클라이언트가 연결되기를 기다린다.
- 동기화 메소드로 블록킹 된다.
- 클라이언트의 연결 요청이오면 해당 클라이언트에 대한 소켓 객체를 생성해서 돌려준다.
- client_sock, info= server_sock.accept() : accept()를 하게되면 client_sock에는 객체를, info에는 객체정보를 튜플이 나뉘어서 저장
( client_sock, info ) = ( 객체, 객체정보)
연결 결과물 :
(<socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr= ('192.168.10.154', 9999), raddr=('192.168.12.115', 99999)>, ('192.168.12.115', 99999))
connection from : 192.168.12.115:41326
#> netstat -ant( port번호 식별명령 )
1~65535까지 사용가능
well-known port: 1~1024(10000) - 까지는 안쓰는게 좋다.
>>> tcp_server.py 코드
# vi tcp_server.py
import socket
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) // 전송 방식 결정
server_socket.bind(('',9999))
server_socket.listen(1)
client_socket = server_socket.accept()
print( client_socket )
data = client_socket[0].recv(65535)
print( 'receive:', data.decode())
2. client
1) 소켓 설정
2) 연결 먼저 해줘야함
----- 전화를 받으면 -----------
3) 데이터 송신 send, recv
>>sock = socket.socket(): 전송방식 결정
>>sock.connect( ( 'ip',port ) )
-생성된 소켓 객체를 통해 누구랑 연결할지를 결정
ip : 네트워크상에서 호스트를 식별하는 식별자 ( 호스트마다 다 다른 번호를 사용 )
port : 서버에서 서비스를 식별하는 식별자 (서버에서 정함)
현재 서버에서 서비스중인 포트번호 확인, 서버내에서 중복사용 안됨
>>> tcp_client.py 코드
# vi tcp_client.py
import socket
import sys
if len(sys.argv) < 3:
print("usage: tcp_client.py <ip> <port>")
sys.exit()
ip = sys.argv[1] // 아이피를 sys.argv[1]에서 얻는다
port = int( sys.argv[2]) // sys.argv[2] 에서 얻어온 값을 int변환하여 출력한 값
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect((ip,port))
sock.send('hello'.encode())
★ 데이터 송/수신
- 규칙에 따라서 전송
- 문자 데이터를 송/수신
- 누가 먼저 송신을 하든 상관은 없다.
- 멀티 스레드 프로그래밍을 하지 않는 이상, 송/수신은 동기화 되어야 한다.
( 수신을 받는 구문도, 송신하는 구문도 다 만들어져 있어야 한다.)
- 문자열로만 통신은 안됨, 인코딩과 디코딩으로 이루어진다.
송신(client) -> send()
수신(server) -> recv()
** UDP 의 경우 send() -> sendto()
recv() -> recvfrom()
# python3 tcp_client.py '192.168.4.106' 9999
// 데이터 보내기
>>받은 데이터
#python3 tcp_server.py
>>> type('hello') //유니코드
<class 'str'>
>>> type(b'hello') // 아스키 코드
<class 'bytes'>
>>> string = 'hello'
>>> string[0]
'h'
>>> string = b'hello'
>>> string[0]
104
encode() : str -> bytes
decode() : bytes -> str
>>> string='hello'
>>> string.encode()
b'hello'
>>> string =b'hello'
>>> string.decode()
'hello'
>>>
---> 문자를 주고받는 어플리케이션을 만든 것
눈에 보이지 않음
**부족한 부분 (: 참고 <점프 투 파이썬> )
Python sys 모듈
sys 모듈 : 파이썬 인터프리터가 제공하는 변수들과 함수들을 직접 제어할 수 있게 해주는 모듈이다.
argv = argument avlues (인자값)
명령 행에서 인수 전달하기 - sys.argv
C:/User/home>python test.py abc pey guido
도스 창에서 위의 예처럼 test.py 뒤에 또 다른 값들을 함께 넣어 주면 sys.argv라는 리스트에그 값들이 추가된다.
예제를 따라 하며 확인해 보자. 우선 다음과 같은 파이썬 프로그램을 작성하자. argv_test.py 파일은 C:/Python/Mymodules
디렉터리에 저장했다고 가정한다(만약 C:/Python/Mymodules
디렉터리가 없다면 먼저 생성하고 진행하자).
# argv_test.py
import sys
print(sys.argv)
도스 창에서 다음과 같이 실행해 보자.
C:/Python/Mymodules>python argv_test.py you need python
['argv_test.py', 'you', 'need', 'python']
python이라는 명령어 뒤의 모든 것들이 공백을 기준으로 나뉘어서 sys.argv 리스트의 요소가 됨을 알 수 있다.
(※ 도스 창에서는 /
, \
든 상관없지만, 소스코드 안에서는 반드시 /
또는 \\
기호를 사용해야 한다.)
강제로 스크립트 종료하기 - sys.exit
>>> sys.exit()
sys.exit는 Ctrl+Z
나 Ctrl+D
를 눌러서 대화형 인터프리터를 종료하는 것과 같은 기능을 한다. 프로그램 파일 내에서 사용하면 프로그램을 중단시킨다.
'Network Security > Network' 카테고리의 다른 글
Layer 3/IPv4 (0) | 2017.12.14 |
---|---|
Layer 4/UDP 헤더 분석 (Low Socket) (0) | 2017.12.14 |
UDP socket Programming (0) | 2017.12.12 |
01. 네트워크(Network)-소켓 (socket) (0) | 2017.12.11 |
Network(Linux )시스템 구축 (0) | 2017.12.08 |