Socket programming

Socket

"μ†ŒμΌ“(Socket)"은 μ‚¬μ „μ μœΌλ‘œ "ꡬ멍", "μ—°κ²°", "μ½˜μ„ΌνŠΈ" λ“±μ˜ 의미λ₯Ό κ°€μ§„λ‹€.

λ„€νŠΈμ›Œν¬ ν”„λ‘œκ·Έλž˜λ°μ—μ„œμ˜ μ†ŒμΌ“(Socket)에 λŒ€ν•œ μ˜λ―Έλ„, 사전적 의미λ₯Ό 크게 λ²—μ–΄λ‚˜μ§€ μ•ŠλŠ”λ‹€.

ν”„λ‘œκ·Έλž¨μ΄ λ„€νŠΈμ›Œν¬μ—μ„œ 데이터λ₯Ό μ†‘μˆ˜μ‹ ν•  수 μžˆλ„λ‘, "λ„€νŠΈμ›Œν¬ ν™˜κ²½μ— μ—°κ²°ν•  수 있게 λ§Œλ“€μ–΄μ§„ μ—°κ²°λΆ€"κ°€ λ°”λ‘œ "λ„€νŠΈμ›Œν¬ μ†ŒμΌ“(Socket)"이닀.

https://recipes4dev.tistory.com/153

ν•˜μ§€λ§Œ μ—„λ°€νžˆ λ”°μ§€μžλ©΄, "λ„€νŠΈμ›Œν¬ μ†ŒμΌ“"μ΄λΌλŠ” μš©μ–΄κ°€ μ •ν™•ν•œ ν‘œν˜„μ€ μ•„λ‹ˆλ‹€.

μ „κΈ° μ†ŒμΌ“μ΄ μ „κΈ°λ₯Ό 곡급받기 μœ„ν•΄ μ •ν•΄μ§„ 규격(110V, 220V λ“±)에 맞게 λ§Œλ“€μ–΄μ Έμ•Ό ν•˜λ“―, λ„€νŠΈμ›Œν¬μ— μ—°κ²°ν•˜κΈ° μœ„ν•œ μ†ŒμΌ“ λ˜ν•œ μ •ν•΄μ§„ κ·œμ•½, 즉, 톡신을 μœ„ν•œ ν”„λ‘œν† μ½œ(Protocol)에 맞게 λ§Œλ“€μ–΄μ Έμ•Ό ν•œλ‹€.

보톡 OSI 7 Layer(Open System Interconnection 7 Layer)의 λ„€ 번째 계측인 TCP(Transport Control Protocol) μƒμ—μ„œ λ™μž‘ν•˜λŠ” μ†ŒμΌ“μ„ 주둜 μ‚¬μš©ν•˜λŠ”λ°, 이λ₯Ό "TCP μ†ŒμΌ“" λ˜λŠ” "TCP/IP μ†ŒμΌ“"이라고 λΆ€λ₯Έλ‹€. (UDPμ—μ„œ λ™μž‘ν•˜λŠ” μ†ŒμΌ“μ€ "UDP μ†ŒμΌ“")

TCP/IP μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ°

μ†ŒμΌ“(Socket)을 μ‚¬μš©ν•˜μ—¬ λ„€νŠΈμ›Œν¬ 톡신 κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λŠ” 과정은 κ·Έ κ°œλ…λ§ŒνΌ μ•„μ£Ό λ‹¨μˆœν•˜μ§€λ§Œμ€ μ•Šλ‹€.

μ†ŒμΌ“(Socket)으둜 λ„€νŠΈμ›Œν¬ 톡신 κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ†ŒμΌ“μ„ λ§Œλ“œλŠ” 것과, λ§Œλ“€μ–΄μ§„ μ†ŒμΌ“μ„ 톡해 데이터λ₯Ό μ£Όκ³  λ°›λŠ” μ ˆμ°¨μ— λŒ€ν•œ 이해가 ν•„μš”ν•˜κ³ , 운영체제 및 ν”„λ‘œκ·Έλž˜λ° 언어에 μ’…μ†μ μœΌλ‘œ μ œκ³΅λ˜λŠ” μ†ŒμΌ“ API μ‚¬μš©λ²•μ„ μˆ™μ§€ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

케이블 λΆ„λ¦¬λ‘œ μΈν•œ λ„€νŠΈμ›Œν¬ λ‹¨μ ˆ, νŠΈλž˜ν”½ 증가에 λ”°λ₯Έ 데이터 전솑 μ§€μ—°, μ‹œμŠ€ν…œ λ¦¬μ†ŒμŠ€ 관리 문제둜 μΈν•œ μ—λŸ¬ λ“±, λ„€νŠΈμ›Œν¬ ν™˜κ²½μ—μ„œ λ°œμƒν•  수 μžˆλŠ” λ‹€μ–‘ν•œ μ˜ˆμ™Έμ‚¬ν•­μ— λŒ€ν•΄μ„œλ„ μ²˜λ¦¬κ°€ ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ— λ”μš± μ–΄λ ΅λ‹€.

ν΄λΌμ΄μ–ΈνŠΈ μ†ŒμΌ“, μ„œλ²„ μ†ŒμΌ“

두 개의 μ‹œμŠ€ν…œ(λ˜λŠ” ν”„λ‘œμ„ΈμŠ€)이 μ†ŒμΌ“μ„ 톡해 λ„€νŠΈμ›Œν¬ μ—°κ²°(Connection)을 λ§Œλ“€κΈ° μœ„ν•΄μ„œλŠ”, 졜초 μ–΄λŠ ν•œ κ³³μ—μ„œ κ·Έ λŒ€μƒμ΄ λ˜λŠ” 곳으둜 연결을 μš”μ²­ν•΄μ•Ό ν•œλ‹€.

IP μ£Όμ†Œμ™€ 포트 번호둜 μ‹λ³„λ˜λŠ” λŒ€μƒμ—κ²Œ, μžμ‹ μ΄ 데이터 μ†‘μˆ˜μ‹ μ„ μœ„ν•œ λ„€νŠΈμ›Œν¬ 연결을 μˆ˜λ¦½ν•  μ˜μ‚¬κ°€ μžˆμŒμ„ μ•Œλ¦¬λŠ” 것이닀.

λ¬΄μž‘μ • 연결을 μ‹œλ„ν•œλ‹€κ³  ν•΄μ„œ, κ·Έ μš”μ²­μ΄ 무쑰건 λ°›μ•„λ“€μ—¬μ§€κ³  연결이 λ§Œλ“€μ–΄μ Έ 데이터λ₯Ό μ£Όκ³  받을 수 있게 λ˜λŠ” 것은 μ•„λ‹ˆλ‹€.

ν•œ κ³³μ—μ„œ μ—°κ²° μš”μ²­μ„ 보낸닀고 ν•˜λ”λΌλ„ κ·Έ λŒ€μƒ μ‹œμŠ€ν…œμ΄ κ·Έ μš”μ²­μ„ 받아듀일 μ€€λΉ„κ°€ λ˜μ–΄ μžˆμ§€ μ•Šλ‹€λ©΄, ν•΄λ‹Ή μš”μ²­μ€ λ¬΄μ‹œλ˜κ³  연결은 λ§Œλ“€μ–΄μ§€μ§€ μ•ŠλŠ”λ‹€.

κ·ΈλŸ¬λ―€λ‘œ μš”μ²­μ„ λ°›μ•„λ“€μ΄λŠ” κ³³μ—μ„œλŠ” μ–΄λ–€ μ—°κ²° μš”μ²­(일반적으둜 포트 번호둜 식별)을 받아듀일 것인지λ₯Ό 미리 μ‹œμŠ€ν…œμ— λ“±λ‘ν•˜μ—¬, μš”μ²­μ΄ μˆ˜μ‹ λ˜μ—ˆμ„ λ•Œ ν•΄λ‹Ή μš”μ²­μ„ μ²˜λ¦¬ν•  수 μžˆλ„λ‘ μ€€λΉ„ν•΄μ•Ό ν•œλ‹€.

이렇듯 두 개의 μ‹œμŠ€ν…œ(λ˜λŠ” ν”„λ‘œμ„ΈμŠ€)이 μ†ŒμΌ“μ„ 톡해 데이터 톡신을 μœ„ν•œ μ—°κ²°(Connection)을 λ§Œλ“€κΈ° μœ„ν•΄μ„œλŠ”, μ—°κ²° μš”μ²­μ„ λ³΄λ‚΄λŠ”μ§€ λ˜λŠ” μš”μ²­μ„ λ°›μ•„λ“€μ΄λŠ”μ§€μ— 따라 μ†ŒμΌ“μ˜ 역할이 λ‚˜λ‰˜κ²Œ λ˜λŠ”λ°, μ „μžμ— μ‚¬μš©λ˜λŠ” μ†ŒμΌ“μ„ ν΄λΌμ΄μ–ΈνŠΈ μ†ŒμΌ“(Client Socket), ν›„μžμ— μ‚¬μš©λ˜λŠ” μ†ŒμΌ“μ„ μ„œλ²„ μ†ŒμΌ“(Server Socket)이라고 ν•œλ‹€.

두 μ†ŒμΌ“μ€ λ™μΌν•˜λ‹€. μ—­ν• κ³Ό κ΅¬ν˜„ μ ˆμ°¨μ— 따라 λ‹€λ₯΄κ²Œ λΆ€λ₯΄λŠ” 것일 뿐, μˆœμ„œκ°€ 바뀐닀면 역할도 λ°”λ€ŒλŠ” 것.

Socket API

ν΄λΌμ΄μ–ΈνŠΈ μ†ŒμΌ“(Client Socket)은 처음 μ†ŒμΌ“(Socket)을 생성(create)ν•œ λ‹€μŒ, μ„œλ²„ 츑에 μ—°κ²°(connect)을 μš”μ²­ν•œλ‹€.

그리고 μ„œλ²„ μ†ŒμΌ“μ—μ„œ 연결이 λ°›μ•„λ“€μ—¬μ§€λ©΄ 데이터λ₯Ό μ†‘μˆ˜μ‹ (send/recv)ν•˜κ³ , λͺ¨λ“  μ²˜λ¦¬κ°€ μ™„λ£Œλ˜λ©΄ μ†ŒμΌ“(Socket)을 λ‹«λŠ”λ‹€(close).

μ„œλ²„ μ†ŒμΌ“(Server Socket)은 일단 ν΄λΌμ΄μ–ΈνŠΈμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ 첫 번째 λ‹¨κ³„λŠ” μ†ŒμΌ“(Socket)을 생성(create)ν•œλ‹€.

그리고 μ„œλ²„κ°€ μ‚¬μš©ν•  IP μ£Όμ†Œμ™€ 포트 번호λ₯Ό μƒμ„±ν•œ μ†ŒμΌ“μ— κ²°ν•©(bind)μ‹œν‚¨λ‹€.

그런 λ‹€μŒ ν΄λΌμ΄μ–ΈνŠΈλ‘œλΆ€ν„° μ—°κ²° μš”μ²­μ΄ μˆ˜μ‹ λ˜λŠ”μ§€ μ£Όμ‹œ(listen)ν•˜κ³ , μš”μ²­μ΄ μˆ˜μ‹ λ˜λ©΄ μš”μ²­μ„ λ°›μ•„λ“€μ—¬(accept) 데이터 톡신을 μœ„ν•œ μ†ŒμΌ“μ„ μƒμ„±ν•œλ‹€.

일단 μƒˆλ‘œμš΄ μ†ŒμΌ“μ„ 톡해 연결이 수립(ESTABLISHED)되면, ν΄λΌμ΄μ–ΈνŠΈμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ 데이터λ₯Ό μ†‘μˆ˜μ‹ (send/recv)ν•  수 μžˆλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ 데이터 μ†‘μˆ˜μ‹ μ΄ μ™„λ£Œλ˜λ©΄, μ†ŒμΌ“(Socket)을 λ‹«λŠ”λ‹€(close).

Last updated