파이썬(Python)/화이트해킹,침투테스트(Hack,Penetration)

python socket이란? AF_INET, SOCK_STREAM 의미, 간단하게 텍스트 주고 받는 서버 만들기

끄적끄적아무거나 2021. 8. 4. 09:36
반응형

python socket이란?

 

Socket(소켓)이란 간단히 설명하면 네트워크에서 패킷을 주고 받을 때 각 end 단에서 application으로 넘어가기전에 받아는 버퍼와 같은 것이다. 

 

서버의 경우 서버에 들어오기 전에 Load balancer가 소켓으로 동작한다고 볼 수 있다. 그리고 클라이언트 측에서는 웹브라우저에 들어가기전에 버퍼역할을 하는 것이 소켓이라고 할 수 있다.

 


AF_INET, SOCK_STREAM 의미

 

AF_INET, SOCK_STREAM 는 socket을 설정할 때 특성 값이다. 

 

AF_INET 는 해당 소켓은 IP version 4 용으로 사용하겠다는 의미이다.

SOCK_STREAM 는 해당 소켓에 TCP 패킷을 받겠다는 의미이다.

 


간단하게 텍스트 주고 받는 서버 만들기

 

코드 - 서버측>

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(),8080))
s.listen(10)

while True:
    c_socket, client_ip = s.accept()
    print(f"{client_ip} 가 연결되었습니다.")
    print("Client Socket info : ", c_socket)
    c_socket.send(bytes("Hi","utf-8"))

 

코드 - 클라이언트측>>

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(),8080))

message = s.recv(1024).decode("utf-8")
print(message)

 

결과 - 서버측>>

('192.168.0.111', 1075) 가 연결되었습니다.
Client Socket info :  <socket.socket fd=688, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.0.111', 8080), raddr=('192.168.0.111', 1075)>

 

결과 - 클라이언트측>>

Hi

 

주석 - 서버측>>

import socket

socket은 내장 함수로 별도의 설치가 필요 없다. 

 

s.bind((socket.gethostname(),8080))

bind는 서버측에 8080포트에 연결하겠다는 뜻이다. gethostname은 내 컴퓨터 내에서 연결하겠다는 의미이다. 다른 값으로 localhost, 127.0.0.1 로 사용할 수 있다. 그리고 bind 를 (()) 두 번의 괄호를 사용한 이유는 bind 가 튜플로 값을 받기 때문이다.

 

c_socketclient_ip = s.accept()

클라이언트에서 연결요청을 보내면 accept로 받고 return 값으로 소켓정보와 ip정보가 나온다.

 

c_socket.send(bytes("Hi","utf-8"))

메세지를 보낼땐 바이트로 보내야 한다. 

 

 

주석 - 클라이언트측>>

s.connect((socket.gethostname(),8080))

서버측 8080 포트에 연결하겠다는 의미이다. 만일 동일 PC가 아닌 외부에 연결할 경우 gethostname이 아닌 아이피를 입력하면 된다.

 

message = s.recv(1024).decode("utf-8")

1024는 1024바이트 사이즈 버퍼를 준비하겠다는 의미이다. 

 

 

반응형