๊ด€๋ฆฌ ๋ฉ”๋‰ด

OkBublewrap

2025-04-27 TIL (socket, ๋ถ์Šคํ„ฐ๋””) ๋ณธ๋ฌธ

Today I Learning

2025-04-27 TIL (socket, ๋ถ์Šคํ„ฐ๋””)

์˜ฅ๋ฝ๋ฝ 2025. 4. 28. 00:07

๐Ÿ“… 2025-04-27 | TIL (Today I Learned)

๐Ÿ“‹ ํ•˜๋ฃจ ์š”์•ฝ

  • ์ง‘์•ˆ์ผ
  • socket
  • ๋ฐ”๋ฐ”๋ผ๋ฏผํ†  ๋ถ์Šคํ„ฐ๋””

 

โšก๏ธ ํšŒ๊ณ 

socket(low-level)

์†Œ์ผ“์ด๋ž€ ์†Œํ”„ํŠธ์›จ์–ด๋กœ ์ž‘์„ฑ๋œ ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ์™€ ๋„คํŠธ์›Œํฌ๋ฅผ ํ† ์•ป ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹ ํ•˜๊ธฐ ์œ„ํ•œ ์ฐฝ๊ตฌ ์—ญํ• ์„ ํ†ต์‹  ์ ‘์†์ ์ž…๋‹ˆ๋‹ค.

ํฌํŠธ๋ž€ ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ˜ธ์ŠคํŠธ ๋‚ด๋ถ€์ ์œผ๋กœ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ• ๋‹น๋ฐ›์•„์•ผ ํ•˜๋Š” ๊ณ ์œ ํ•œ ์ˆซ์ž์ž…๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ ์†Œ์ผ“์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํฌํŠธ๋ฅผ ํ• ๋‹น ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

    [ํด๋ผ์ด์–ธํŠธ]                    [์„œ๋ฒ„]
    ์†Œ์ผ“ ์ƒ์„ฑ                         ์†Œ์ผ“ ์ƒ์„ฑ
    → connect()    ----->        bind() + listen()
                                            → accept()
    send("์•ˆ๋…•!")   ----->         recv()

 

# ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

# ์ ‘์†ํ•  ์„œ๋ฒ„ ์ฃผ์†Œ, localhost
HOST = '127.0.0.1'
PORT = 9999

# ์†Œ์ผ“ ๊ฐ์ฒด ์ƒ์„ฑ
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# socket.AF_INET: IPv4
# socket.SOCK_STREAM: ์†Œ์ผ“ ํƒ€์ž…์œผ๋กœ TCP

# ํฌํŠธ ์„ค์ •
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# ์„œ๋ฒ„๋ฅผ ๊ป๋‹ค ์ผœ๋„ ๋ฐ”๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์˜ต์…˜
# 0: ๋”, 1: ํ‚ด
# socket.SO_REUSEADDR: ํฌํŠธ ์žฌ์‚ฌ์šฉ
# socket.SOL_SOCKET: ์†Œ์ผ“ ๋ ˆ๋ฒจ ์„ค์ •

# ์„œ๋ฒ„ ํด๋ผ์ด์–ธํŠธ ์ ‘์† ํ—ˆ์šฉ
server_socekt.listen()
print('์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.')

# accept ํ•จ์ˆ˜์—์„œ ๋Œ€๊ธฐํ•˜๋‹ค๊ฐ€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ‘์†ํ•˜๋ฉด ์ƒˆ๋กœ์šด ์†Œ์ผ“์„ ๋ฆฌํ„ด
client_socket, addr = server_socekt.accpet()
print('์ ‘์†ํ•œ ํด๋ผ์ด์–ธํŠธ ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค.')
print('connected by', addr)
# addr: ์ ‘์† ๋ฃจํŠธ

while True:
	data =  client_socket.recv(1024)
    # recv(1024): ๋ฌธ์ž์—ด 1024๋ฐ”์ดํŠธ ์ œํ•œ
    if not data:
    	break
        
    # ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์ถœ๋ ฅ
    print('Received From', addr, data.decode())
    
    # ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ํด๋ผ์ด์–ธํŠธ ํ•œํ…Œ ๋ณด๋‚ด๊ธฐ
    client_socket.sendall(data)
    
client_socket.close()
server_socekt.close()

 

select

์œ„์˜ socket๋งŒ ์‚ฌ์šฉํ•œ ์„œ๋ฒ„ ํ†ต์‹ ์€ ํด๋ผ์ด์–ธํŠธ ์†Œ์ผ“ ์„œ๋ฒ„์— ์ ‘์†ํ•˜์—ฌ ์ ‘์†์„ ์ข…๋ฃŒํ•˜๋ฉด ์„œ๋ฒ„ ์—ญ์‹œ ์ข…๋ฃŒ๋œ๋‹ค. ์†Œ์ผ“ ์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ์™€ ๋™์‹œ์— ์ ‘์†ํ•  ์ˆ˜ ์—†๋‹ค.

 

select๋Š” ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ํ•˜๋‚˜์˜ ์ „์†ก๋กœ๋„ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹ ํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๋ชจ๋“ˆ

ํ•œ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๋กœ ๋‘ ๊ฐœ ์ด์ƒ์˜ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š” I/O ๋ฉ€ํ‹ฐ ํ”Œ๋ ‰์‹ฑ์„ ๊ฐ€๋Šฅ

select๋Š” ์†Œ์ผ“์—์„œ ์ถœ๋ ฅ๋˜๋‹ˆ read, write, except ๋ฆฌ์ŠคํŠธ๋ฅผ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉ

 

์˜ค๋Š˜ ๋ฐฐ์šด ํ•ต์‹ฌ ์ฃผ์ œ

์†Œ์ผ“ ํ†ต์‹ ์˜ ๊ธฐ๋ณธ ํ๋ฆ„๊ณผ ์‚ฌ์šฉ๋ฒ•(TCP ์„œ๋ฒ„-ํด๋ผ์ด์–ธํŠธ)

 

๊ฐœ๋… ์š”์•ฝ

  • socket.socket(AF_INET, SOCK_STREAM): TCP ์†Œ์ผ“ ์ƒ์„ฑ
  • bind(), listen(), accept(): ์„œ๋ฒ„ ์ค€๋น„ ๋‹จ๊ณ„
    • bind(): ๋‚ด ์†Œ์ผ“์ด ์‚ฌ์šฉํ•  IP ์ฃผ์†Œ์™€ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์ง€์ •ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค.
    • listen(): ๋Œ€๊ธฐํ•˜๋Š” ์ƒํƒœ๋กœ ์ „ํ™˜
    • accpet(): ์‹ค์ œ๋กœ ํด๋ผ์ด์–ธํŠธ ์ ‘์† ์ˆ˜๋ฝ
  • select(): ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๊ธฐ
    • read: ์ฝ์„ ์ค€๋น„๋œ ์†Œ์ผ“
    • write: ์“ธ ์ค€๋น„๋œ ์†Œ์ผ“
    • except: ์—๋Ÿฌ๋‚œ ์†Œ์ผ“

[์†Œ์ผ“1] (์•„์ง ๋ฐ์ดํ„ฐ ์—†์Œ)
[์†Œ์ผ“2] (๋ฐ์ดํ„ฐ ๋„์ฐฉ!)
[์†Œ์ผ“3] (์•„์ง ์—†์Œ)

select(read_list=[์†Œ์ผ“1, ์†Œ์ผ“2, ์†Œ์ผ“3]) ํ˜ธ์ถœ
→ ๊ฒฐ๊ณผ: [์†Œ์ผ“2]๋งŒ ๋ฆฌํ„ด

  • SO_REUSEADDR: ํฌํŠธ ์žฌ์‚ฌ์šฉ ํ—ˆ์šฉ ์˜ต์…˜

 

๋А๋‚€์ 

๊ฐ„๋‹จํ•œ ์„œ๋ฒ„, ํด๋ผ์ด์–ธํŠธ ์†Œ์ผ“์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ๋‹ค.

select()์„ ํ™œ์šฉํ•˜๋ฉด ๋‹ค์ค‘ ํด๋ผ์ด์–ธํŠธ ์ฒ˜๋ฆฌ๊ฐ€ ํ›จ์”ฌ ํšจ์œจ์ ์ด๋‹ค.

SO_REUSEADDR ์„ค์ •์€ ์„œ๋ฒ„ ๊ฐœ๋ฐœํ•  ๋•Œ ๊ฑฐ์˜ ํ•„์ˆ˜๋‹ค.

 

โœ”๏ธ To-Do

2025.04.28 ํ• ์ผ

  • pass by pass ๊ณผ์ œ ์ œ์ถœ
  • ๊ฐ•์˜ 1๊ฐœ ๋“ฃ๊ธฐ
  • ๋ฉด์ ‘ ์Šคํ„ฐ๋””
  • ๋ถ ์Šคํ„ฐ๋””

'Today I Learning' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

2025-04-29 TIL (์ผ๊ธฐ)  (0) 2025.04.30
2025-04-28 TIL (Python ์ด๋ฉ”์ผ ์†ก/์ˆ˜์‹ )  (0) 2025.04.28
2025-04-23 TIL (gensim)  (0) 2025.04.23
2025-04-15 TIL (์ผ๊ธฐ)  (0) 2025.04.16
2025-04-14 TIL (๋ฉด์ ‘ ์ค€๋น„)  (2) 2025.04.15