티스토리 뷰



 #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+ZCtrl+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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/06   »
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
글 보관함