๐Ÿ’ป/CS

[๋„คํŠธ์›Œํฌ] ํŒŒ์ด์ฌ ์ฑ„ํŒ… ํ”„๋กœ๊ทธ๋žจ

ruhz 2020. 9. 18. 17:57

IP ์ฃผ์†Œ

https://terms.naver.com/entry.nhn?docId=3571314&cid=59088&categoryId=59096

 

IP ์ฃผ์†Œ

[ IP ์ฃผ์†Œ๋ž€ ๋ฌด์—‡์ธ๊ฐ€ ] ํ˜„์žฌ(2015๋…„ ๊ธฐ์ค€) ์ธํ„ฐ๋„ท์— ์—ฐ๊ฒฐ๋œ ์ปดํ“จํ„ฐ(ํ˜น์€ ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ ๋“ฑ)์— ํ• ๋‹น๋œ IP ์ฃผ์†Œ๋Š” ๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„ IPv4(IPversion4) ํ˜•ํƒœ๋‹ค. ์ด IPv4์˜ ์ฃผ์†Œ ์ฒด๊ณ„๋Š” 3์ž๋ฆฌ ์ˆซ์ž๊ฐ€ 4๋งˆ๋””๋กœ ํ‘œ๊ธฐ๋œ๋‹ค

terms.naver.com

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์ฃผ์†Œ๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธˆ์ƒˆ ํฌํ™”๋  ๊ฒƒ์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

ํ”„๋กœํ† ์ฝœ

์ถœ์ฒ˜ : Computer Networking : A Top-Down Approach

๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ด์•ผ๊ธฐํ•  ๋•Œ ์ •ํ•œ ์•ฝ์†์ด๋‹ค. ์„ค๋ช…ํ•ด๋„ ์„œ๋กœ ์˜์‚ฌ์†Œํ†ต์ด ์ž˜ ์•ˆ ๋˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ๋‹ค๋ฉด, '์ € ์‚ฌ๋žŒ์€ ๋‚˜๋ž‘ ํ”„๋กœํ† ์ฝœ์ด ์ž˜ ์•ˆ ๋งž์•„' ๋ผ๊ณ  ์ด์•ผ๊ธฐํ•˜๋„๋ก ํ•˜์ž.

 

PF_INET, AF_INET ์ •๋ฆฌ

https://bbolmin.tistory.com/25

 

PF_INET์™€ AF_INET

์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ๋•Œ socket()ํ•จ์ˆ˜์—์„œ๋Š” PF_INET์œผ๋กœ ipv4 ํ”„๋กœํ† ์ฝœ์„ ํ‘œํ˜„ํ•˜๊ณ  struct sockaddr_in ์˜ sin_family์—๋Š” AF_INET์œผ๋กœ ipv4๋ฅผ ํ‘œํ˜„ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ PF_INET์™€ AF_INET์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?..

bbolmin.tistory.com

 

์†Œ์ผ“

๋„คํŠธ์›Œํฌ ์†Œ์ผ“(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

 

๋„คํŠธ์›Œํฌ ์†Œ์ผ“ - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „. ๋„คํŠธ์›Œํฌ ์†Œ์ผ“(network socket)์€ ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ฒฝ์œ ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ ์˜ ์ข…์ฐฉ์ ์ด๋‹ค. ์˜ค๋Š˜๋‚  ์ปดํ“จํ„ฐ ๊ฐ„ ํ†ต์‹ ์˜ ๋Œ€๋ถ€๋ถ„์€ ์ธํ„ฐ๋„ท ํ”„๋กœํ† ์ฝœ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜

ko.wikipedia.org

 

Blocking, Timeout

์†Œ์ผ“์˜ ๊ธฐ๋ณธ ๋ชจ๋“œ๋Š” ๋ธ”๋ผํ‚น ๋ชจ๋“œ์ด๋‹ค. ์ด๋Š” ์†ก์‹  ๊ณผ ์ˆ˜์‹  ์‹œ ์†Œ์ผ“์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„ ๋  ๋•Œ๊นŒ์ง€ ํ”„๋กœ๊ทธ๋žจ์ด ์ •์ง€ํ•œ๋‹ค๋Š” ๊ฒƒ ๊ฐ€๋” ์ด ๋ชจ๋“œ๋กœ ๋™์ž‘ํ•˜๋ฉด ์–‘ ์ชฝ endpoint์—์„œ ๋ฐ์ดํ„ฐ์˜ ์†ก์ˆ˜์‹ ์„ ๊ธฐ๋‹ค๋ฆฌ๋ฉด์„œ ๋ฐ๋“œ๋ฝ์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์†Œ์ผ“์€ blocking ์„ค์ •์„ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋‹ค. socket.setblocking() ๋Š” ๊ธฐ๋ณธ๊ฐ’์ด 1๋กœ blocking ์ด ์ผœ์žˆ๋Š” ๊ฒƒ ์ด ๊ฐ’์„ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋ฉด blocking์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„ ์†Œ์ผ“์ด ๋™์ž‘์„ ์ค€๋น„ํ•˜์ง€ ์•Š๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— socket.error ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ํƒ€์ž„์•„์›ƒ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ. socket.setimeout(float)๋Š” ์ดˆ๋‹จ์œ„ ์‹œ๊ฐ„์„ ์ง€์ •ํ•˜์—ฌ ์†Œ์ผ“์ด ์ค€๋น„๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๋Œ€๋ถ€๋ถ„ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

[์ถœ์ฒ˜] [network] ํŒŒ์ด์ฌ ์†Œ์ผ“ ํ†ต์‹ |์ž‘์„ฑ์ž ์ดˆ์ดˆ

 

UTF-8 ์ธ์ฝ”๋”ฉ

https://blog.naver.com/bbmobile/221360230141

 

ํ•œ๊ธ€ ์ธ์ฝ”๋”ฉ, EUCKR ๊ณผ UTF8 ์ œ๋Œ€๋กœ ์•Œ๊ธฐ (1)

๊ฐœ๋ฐœ์ž๋ผ๋ฉด ํ•œ ๋ฒˆ์ฏค 'ํ•œ๊ธ€'์„ ๊นจ๋œจ๋ ค ๋ณธ ๊ฒฝํ—˜์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์–ด๋””์„œ ๋ˆ„๊ฐ€ ๊นจ๋œจ๋ ธ๋Š”์ง€, ์™œ ๊นจ๋œจ๋ ธ๋Š”์ง€ ์˜๋ฌธ...

blog.naver.com

 

์˜ˆ์ œ์ฝ”๋“œ

https://pythonprogramming.net/server-chatroom-sockets-tutorial-python-3/

 

Python Programming Tutorials

Socket Chatroom server - Creating chat application with sockets in Python We've made it through the basics of working with sockets, and now we're ready to try to actually build something with them, so, in this sockets with Python tutorial, we're going to b

pythonprogramming.net

# 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