IP ์ฃผ์
https://terms.naver.com/entry.nhn?docId=3571314&cid=59088&categoryId=59096
IP์ฃผ์๋ ๊ฐ ๊ธฐ๊ธฐ์ ๊ณ ์ ํ ์ ํ๋ฒํธ ๊ฐ์ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ธํฐ๋ท์ ์ฌ์ฉํ๋ ์ ์ธ๊ณ ๋ชจ๋ ๊ธฐ๊ธฐ๋ ๊ฐ๊ฐ์ IP์ฃผ์๋ฅผ ๊ฐ๋๋ค. ์์ ์๋ ๋๋ถ๋ถ 4๊ฐ์ ์๋ก IP์ฃผ์๋ฅผ ํํํ๋ IPv4๋ฅผ ์ฌ์ฉํ๋ค. 1๊ฐ์ ์๋ ๊ฐ๊ฐ 0~255์ ์๋ฅผ ํํํ๊ฒ ๋๊ณ , ๋ฐ๋ผ์ IPv4๋ 2564 = 4,294,967,296 ์ฝ 42์ต๊ฐ์ ์ฃผ์๋ฅผ ๋ถ์ฌํ ์ ์๋ค.
ํ์ง๋ง ์ธํฐ๋ท์ด ๋ณดํธํ ๋จ์ ๋ฐ๋ผ ์ฃผ์๊ฐ ํฌํ๊ฐ ๋์๊ณ , 6๊ฐ์ ์๋ก IP์ฃผ์๋ฅผ ํํํ๋ IPv6์ด ๋์ค๊ฒ ๋๋ค. IPv6์ 2556 = 281,474,976,710,656 ์ฝ 280์ต๊ฐ์ ์ฃผ์๋ฅผ ๋ถ์ฌํ ์ ์๋ค. ํ์ง๋ง ์ด ๋ง์ ๋, ์ฌ๋ฌผ์ธํฐ๋ท(IoT)์ด ๋ฐ๋ฌํ๋ฉด์ ์ธํฐ๋ท์ ์ฐ๊ฒฐ๋ ์ฌ๋ฌผ์ ๋ชจ๋ IP์ฃผ์๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ๊ธ์ ํฌํ๋ ๊ฒ์ด๋ผ๊ณ ํ๋ค.
ํ๋กํ ์ฝ
๋คํธ์ํฌ๋ฅผ ํตํด ์ด์ผ๊ธฐํ ๋ ์ ํ ์ฝ์์ด๋ค. ์ค๋ช ํด๋ ์๋ก ์์ฌ์ํต์ด ์ ์ ๋๋ ์ฌ๋์ด ์๋ค๋ฉด, '์ ์ฌ๋์ ๋๋ ํ๋กํ ์ฝ์ด ์ ์ ๋ง์' ๋ผ๊ณ ์ด์ผ๊ธฐํ๋๋ก ํ์.
PF_INET, AF_INET ์ ๋ฆฌ
https://bbolmin.tistory.com/25
์์ผ
๋คํธ์ํฌ ์์ผ(network socket)์ ์ปดํจํฐ ๋คํธ์ํฌ๋ฅผ ๊ฒฝ์ ํ๋ ํ๋ก์ธ์ค ๊ฐ ํต์ ์ ์ข ์ฐฉ์ ์ด๋ค
https://ko.wikipedia.org/wiki/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC_%EC%86%8C%EC%BC%93
Blocking, Timeout
์์ผ์ ๊ธฐ๋ณธ ๋ชจ๋๋ ๋ธ๋ผํน ๋ชจ๋์ด๋ค. ์ด๋ ์ก์ ๊ณผ ์์ ์ ์์ผ์ ๋ฐ์ดํฐ๊ฐ ์ค๋น ๋ ๋๊น์ง ํ๋ก๊ทธ๋จ์ด ์ ์งํ๋ค๋ ๊ฒ ๊ฐ๋ ์ด ๋ชจ๋๋ก ๋์ํ๋ฉด ์ ์ชฝ endpoint์์ ๋ฐ์ดํฐ์ ์ก์์ ์ ๊ธฐ๋ค๋ฆฌ๋ฉด์ ๋ฐ๋๋ฝ์ด ๊ฑธ๋ฆด ์ ์๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์ ์์ผ์ blocking ์ค์ ์ ํด์ ํ ์ ์๋ค. socket.setblocking() ๋ ๊ธฐ๋ณธ๊ฐ์ด 1๋ก blocking ์ด ์ผ์๋ ๊ฒ ์ด ๊ฐ์ ๋ค๋ฅธ ๊ฐ์ผ๋ก ์ค์ ํ๋ฉด blocking์ ์ฌ์ฉํ์ง ์์ ์์ผ์ด ๋์์ ์ค๋นํ์ง ์๊ณ ์๊ธฐ ๋๋ฌธ์ socket.error ๊ฐ ๋ฐ์ํ๋ค. ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ํ์์์์ ์ค์ ํ๋ ๊ฒ. socket.setimeout(float)๋ ์ด๋จ์ ์๊ฐ์ ์ง์ ํ์ฌ ์์ผ์ด ์ค๋น๋์๋์ง ํ์ธํ๋ค. ์ด ๋ฐฉ๋ฒ์ ๋๋ถ๋ถ ์ ์ฉ์ด ๊ฐ๋ฅํ๋ค.
[์ถ์ฒ] [network] ํ์ด์ฌ ์์ผ ํต์ |์์ฑ์ ์ด์ด
UTF-8 ์ธ์ฝ๋ฉ
https://blog.naver.com/bbmobile/221360230141
์์ ์ฝ๋
https://pythonprogramming.net/server-chatroom-sockets-tutorial-python-3/
# Client
import socket
import select
import errno
HEADER_LENGTH = 10
IP = "127.0.0.1"
PORT = 1234
# ์ฌ์ฉ์ ์ด๋ฆ์ ์
๋ ฅํ๋ค.
my_username = input("Username: ")
# ์์ ์ ์์ผ์ ์์ฑํ๋ค.
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# ์์ ์ ์์ผ์, ์ง์ ํ IP์ ํฌํธ๋ฅผ ๊ฐ์ง ์์ผ์ ์ฐ๊ฒฐํ๋ค.
client_socket.connect((IP, PORT))
# Blocking์ ํ์ด์ฃผ๊ณ ๋ช๊ฐ์ง ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ค๋ค.
client_socket.setblocking(False)
# ์ฌ์ฉ์์ ์ด๋ฆ์ ๋ณด๋ธ๋ค(์๋ ์ค๋ช
์ฐธ์กฐ).
username = my_username.encode('utf-8')
username_header = f"{len(username):<{HEADER_LENGTH}}".encode('utf-8')
client_socket.send(username_header + username)
while True:
# ์ฌ์ฉ์์ ๋ฉ์ธ์ง ์
๋ ฅ์ ๊ธฐ๋ค๋ฆฐ๋ค.
message = input(f'{my_username} > ')
# ์
๋ ฅ๋ ๋ฉ์ธ์ง๊ฐ ์๋ค๋ฉด,
if message:
# ๋ฉ์ธ์ง์ ํค๋(๋ฉ์ธ์ง์ ๊ธธ์ด)๋ฅผ ์ธ์ฝ๋ฉํด์ ์ ์กํ๋ค.
# ์ฒ์์ ์ด๋ฆ
message = message.encode('utf-8')
message_header = f"{len(message):<{HEADER_LENGTH}}".encode('utf-8')
client_socket.send(message_header + message)
# ์
๋ ฅ๋ ๋ฉ์ธ์ง๊ฐ ์๋ ์๋ input์ด ๋๋๋ฉด,
try:
# ์๋ฒ์์ ๋ฉ์ธ์ง๋ฅผ ๋ฐ์์ฌ ๊ฒ์ด๋ค.
'''
(username_header) + (username) + (message_header) + (message)
- ๋ฉ์ธ์ง๋ ํ๋กํ ์ฝ์ ์ํด ์์ ๊ฐ์ด ์ฝ์๋์ด ์๋ค.
- ํค๋๋ ์์ ์ ๊ธธ์ด๊ฐ ์์๋ก ๊ณ ์ ๋์ด ์๊ณ , ์์ ๋ค์ ๋ฐ์ดํฐ ๊ธธ์ด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
'''
while True:
# ์๋ฒ์์ ํค๋๋ฅผ ๋ฐ์ ์จ๋ค.
username_header = client_socket.recv(HEADER_LENGTH)
# ํค๋๋ฅผ ๋ฐ์์ฌ ์ ์๋ค(=์๋ฒ ์ฐ๊ฒฐ์ด ๋๊ฒผ๋ค)๋ฉด,
if not len(username_header):
print('Connection closed by the server')
# ์ข
๋ฃํ๋ค.
sys.exit()
# ๋ฐ์ ํค๋๋ ์ธ์ฝ๋ฉ ๋์ด ์์ผ๋ฏ๋ก ๋์ฝ๋ฉํ๋ค.
username_length = int(username_header.decode('utf-8').strip())
# ํค๋๋ฅผ ์ด์ฉํด ์ด๋ฆ์ ์ฝ์ด์จ๋ค.
username = client_socket.recv(username_length).decode('utf-8')
# ์ฑํ
๋ด์ฉ๋ ๊ฐ์ ๊ณผ์ ์ผ๋ก ์ฝ์ด์จ๋ค.
message_header = client_socket.recv(HEADER_LENGTH)
message_length = int(message_header.decode('utf-8').strip())
message = client_socket.recv(message_length).decode('utf-8')
# ๋ฐ์์จ ์ด๋ฆ๊ณผ ์ฑํ
๋ด์ฉ์ ์ถ๋ ฅํ๋ค.
print(f'{username} > {message}')
except IOError as e:
# This is normal on non blocking connections - when there are no incoming data error is going to be raised
# Some operating systems will indicate that using AGAIN, and some using WOULDBLOCK error code
# We are going to check for both - if one of them - that's expected, means no incoming data, continue as normal
# If we got different error code - something happened
if e.errno != errno.EAGAIN and e.errno != errno.EWOULDBLOCK:
print('Reading error: {}'.format(str(e)))
sys.exit()
# We just did not receive anything
continue
except Exception as e:
# Any other exception - something happened, exit
print('Reading error: '.format(str(e)))
sys.exit()
# Server
'๐ป > CS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋คํธ์ํฌ] ๋คํธ์ํฌ๋ ๋ฌด์์ธ๊ฐ? (0) | 2020.10.19 |
---|---|
[๋ผ์ฆ๋ฒ ๋ฆฌํ์ด] ์กฐ๋ฆฝ(3B, TouchScreen) (0) | 2020.10.15 |
[ํ๋์จ์ด] ๋ฉ๋ชจ๋ฆฌ, CPU (0) | 2020.09.18 |
[ํ๋์จ์ด] ์ด์์ฒด์ , ์ ์ฅ์ฅ์น (0) | 2020.09.09 |
[ํ๋์จ์ด] ์กฐ๋ฆฝPC ๊ตฌ๋งคํ๊ธฐ (0) | 2020.09.08 |