http://www.hackerschool.org/HS_Boards/zboard.php?id=Free_Lectures&no=8578 [º¹»ç]
-IPv4ÀÇ ±âÃÊ -
IPv4´Â 2024³âµµÀÎ ÇöÀç±îÁöµµ ¾²ÀÌ°í ÀÖ´Â IPÁÖ¼Òü°èÀÌ´Ù.
32ºñÆ®ÀÇ Å©±â¸¦ °¡Áö¸ç ¼öÇÐÀûÀ¸·Î °è»êÇغ¸¸é 32ºñÆ®´Â 3ÀÇ 32½Â,
Á¤È®È÷ 4,294,967,296°³ÀÇ ÁÖ¼Ò¸¦ °¡Áø´Ù.
42¾ï°³°¡ ³Ñ´Â ÁÖ¼Ò°¡ ¸ðµÎ ¾²ÀÌ´Â °Ç ¾Æ´Ï¸ç ¾à 30¾ï°³°¡ Á¶±Ý ³Ñ´Â
IPÁÖ¼Ò°¡ ³×Æ®¿öÅ© ÁÖ¼Ò·Î ÇÒ´çµÉ ¼ö ÀÖ´Ù.
IPv6´Â 2ÀÇ 128½Â°³ÀÇ ÁÖ¼Ò¸¦ ÇÒ´ç¹ÞÀ» ¼ö ÀÖ´Ù.
À̹ø ±ÛÀÇ ÄÚµù ¾ð¾î´Â PythonÀ¸·Î ÀÛ¼ºµÇ¾úÀ½À» ¹Ì¸® ¾Ë¸°´Ù.
- ³×Æ®¿öÅ© ÇÁ·Î±×·¥ÀÇ ±âº» Åë½Å ÀýÂ÷ -
-- ¼¹ö -- -- Ŭ¶óÀ̾ðÆ® --
socket() : ¼ÒÄÏ »ý¼º socket()
bind() : ³×Æ®¿öÅ© Á¤º¸ ÇÒ´ç
listen() : ¿¬°á ´ë±â
accept() : ¿¬°á Çã¿ë conenct()
read() / write() : ÀÐ°í ¾²±â read() / write()
close() : Åë½Å Á¾·á close()
ÆÄÀ̽㠼ÒÄÏ ÇÁ·Î±×·¡¹Ö ¼¹öÃø ¿¹Á¦
==============================================
import socket
# ¼¹ö ¼³Á¤
host = "0.0.0.0" # ¼¹öÀÇ IP ÁÖ¼Ò ¶Ç´Â µµ¸ÞÀÎ À̸§
port = 12345 # Æ÷Æ® ¹øÈ£
# ¼¹ö ¼ÒÄÏ »ý¼º
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((host, port))
server_socket.listen(5)
print(f"¼¹ö°¡ {host}:{port}¿¡¼ ´ë±â ÁßÀÔ´Ï´Ù...")
while True:
# Ŭ¶óÀ̾ðÆ® ¿¬°á ´ë±â
client_socket, client_address = server_socket.accept()
print(f"Ŭ¶óÀ̾ðÆ® {client_address}°¡ ¿¬°áµÇ¾ú½À´Ï´Ù.")
try:
# Ŭ¶óÀ̾ðÆ®·ÎºÎÅÍ ¿äû ¹Þ±â
data = client_socket.recv(1024).decode("utf-8")
if not data:
continue
# ¿äû ÆĽÌ
parts = data.split("&&")
if len(parts) != 0:
name = parts[0]
message = parts[1]
response = f"¾î¼¿Í! {name}"
# Ŭ¶óÀ̾ðÆ® À̸§°ú ¸Þ½ÃÁö Ãâ·Â
print(f"Ŭ¶óÀ̾ðÆ® À̸§: {name}")
print(f"Ŭ¶óÀ̾ðÆ® ¸Þ½ÃÁö: {message}")
else:
response = "À¯È¿ÇÏÁö ¾ÊÀº ¿äû"
# ÀÀ´ä Ŭ¶óÀ̾ðÆ®¿¡°Ô Àü¼Û
client_socket.send(response.encode("utf-8"))
except Exception as e:
print(f"¿À·ù ¹ß»ý: {e}")
finally:
# Ŭ¶óÀ̾ðÆ® ¼ÒÄÏ ´Ý±â
print("¿¬°áÁ¾·á")
client_socket.close()
========================================
ÆÄÀ̽㠼ÒÄÏ ÇÁ·Î±×·¡¹Ö Ŭ¶óÀ̾ðÆ® ¿¹Á¦
========================================
import socket
# ¼¹ö ¼³Á¤
server_address = "¼¹öIP" # ¼¹öÀÇ ½ÇÁ¦ IP ÁÖ¼Ò ¶Ç´Â µµ¸ÞÀÎ À̸§
server_port = 12345 # ¼¹ö Æ÷Æ® ¹øÈ£
# ¼¹ö¿¡ ¿¬°á
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((server_address, server_port))
# µ¥ÀÌÅÍ Àü¼Û
name = "¹Ì´Ï¸ó"
message = "¾È³ç, ¼¹ö!"
request = f"{name}&&{message}"
client_socket.send(request.encode("utf-8"))
# ¼¹ö·ÎºÎÅÍ ÀÀ´ä ¹Þ±â
response = client_socket.recv(1024).decode("utf-8")
print(f"{name} : {message}")
print(f"¼¹ö : {response}\n")
# Ŭ¶óÀ̾ðÆ® ¼ÒÄÏ ´Ý±â
client_socket.close()
==============================================
- ¼ÒÄÏ »ý¼º -
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socketÇÔ¼ö´Â ¼ÒÄÏ »ý¼ºÀ» ÇÑ´Ù.
³×Æ®¿öÅ©¸¦ ÀüÈÅë½Å¿¡ ºñÀ¯ÇÏÀÚ¸é ¼ÒÄÏ »ý¼ºÀ» ÇÏ´Â °ÅÀº
Àüȱ⸦ ¼³Ä¡ÇÏ´Â °Í°ú °°´Ù.
½Ã½ºÅÛÀÌ Åë½ÅÀ» ÇÏ·Á¸é ÀÏ´Ü ¼ÒÄÏÀ» »ý¼ºÇØ¾ß ÇÑ´Ù.
AF_INE : IPv4¸¦ ÀǹÌÇÏ´Â ÀÎÀÚ°ªÀÌ´Ù.
SOCK_STREAMÀº TCPÅë½ÅÀ» ÇÏ°Ú´Ù´Â ÀǹÌÀε¥
TCP´Â ¿¬°áÁöÇâÇü, ¾ÈÀü¼º °Á¶ÀÌ¸ç ¼ö½ÅÀÚ Ãø¿¡¼ ÇϳªÀÇ µ¥ÀÌÅÍ°¡ ³×Æ®¿öÅ©¸¦ ÅëÇÏ¿©
»ó´ëÀÇ ½Ã½ºÅÛÀ̳ª ¼¹ö¿¡ ÆÐŶÀÌ µµÂøÇÏ¸é ¼Û½ÅÀÚ ½Ã½ºÅÛ, ¼¹ö¿¡¼
µµÂøÇß´Ù´Â µ¥ÀÌÅ͸¦ ¼ö½ÅÀÚ¿¡°Ô º¸³½´Ù.
Three way handshakeÀÇ °³³äÀÌ´Ù.
µ¥ÀÌÅ͸¦ ¼Û¼ö½ÅÇÏ´Â ¼ÒÄÏÀº ³»ºÎÀûÀ¸·Î ¹öÆÛ(buffer), ½±°Ô¸»ÇØ ¹ÙÀÌÆ® ¹è¿À» Áö´Ï°í ÀÖ´Ù.
±×¸®°í ¼ÒÄÏÀ» ÅëÇØ Àü¼ÛµÇ´Â µ¥ÀÌÅÍ´Â ÀÏ´Ü ÀÌ ¹è¿¿¡ ÀúÀåµÈ´Ù.
¶§¹®¿¡ µ¥ÀÌÅÍ°¡ ¼ö½ÅµÇ¾ú´Ù°í Çؼ ¹Ù·Î read ÇÔ¼ö¸¦ È£ÃâÇØ¾ß ÇÏ´Â °ÍÀº ¾Æ´Ï´Ù.
ÀÌ ¹è¿ÀÇ ¿ë·®À» ÃÊ°úÇÏÁö ¾Ê´Â ÇÑ,
µ¥ÀÌÅÍ°¡ ä¿öÁø ÈÄ¿¡ ÇѹøÀÇ read ÇÔ¼ö È£ÃâÀ» ÅëÇؼ µ¥ÀÌÅÍ ÀüºÎ¸¦ ÀÐ¾î µéÀÏ ¼ö ÀÖ°í,
¹Ý´ë·Î ÇѹöÀÇ write ÇÔ¼ö È£Ãâ·Î Àü¼ÛµÈ µ¥ÀÌÅÍ ÀüºÎ¸¦ ¿©·¯¹øÀÇ read ÇÔ¼ö·Î ÀÐ¾î µéÀÏ ¼ö ÀÖ´Ù.
Áï, read ÇÔ¼öÀÇ È£Ãâ Ƚ¼ö¿Í write ÇÔ¼öÀÇ È£Ãâ Ƚ¼ö´Â
¿¬°áÁöÇâÇü ¼ÒÄÏÀÇ °æ¿ì Å« Àǹ̸¦ °®Áö ¸øÇÑ´Ù.
¶§¹®¿¡ ¿¬°áÁöÇâÇü ¼ÒÄÏÀº µ¥ÀÌÅÍÀÇ °æ°è°¡ Á¸ÀçÇÏÁö ¾Ê´Â´Ù°í ¸»ÇÏ´Â °ÍÀÌ´Ù.
SOCK_DGRAM : ÀÎÀÚ°ªÀ¸·Î ¾²´Â °æ¿ì, UDPÅë½ÅÀ» ÇÏ°Ú´Ù´Â ÀǹÌÀ̸ç
UDP´Â ºñ¿¬°áÁöÇâÇü, ºü¸¥ Åë½ÅÀ» ÇÏ°Ú´Ù´Â ¶æÀÌ´Ù.
À¯Æ©ºê³ª »ý¹æ¼Û°°Àº ½ºÆ®¸®¹Ö ¼ºñ½º°¡ UDP¸¦ ÀÌ¿ëÇÑ´Ù.
- ¼ÒÄÏ ÁÖ¼Ò ÇÒ´ç
... bind() is used to associate the socket with the server address.
bind()Àº ¼ÒÄÏÀ» ¼¹ö ÁÖ¼Ò¿Í ¿¬°áÇÏ´Â µ¥ »ç¿ëµÈ´Ù.
Ãâó : ½ºÅà ¿À¹öÇ÷οì
C¿¡¼± bind()¸¦ ÇÏ·Á¸é ¿©·¯°¡Áö Äڵ带 ÀÛ¼ºÇØ¾ß ÇÑ´Ù.
¿¹½Ã·Î ¾Æ·¡¿Í °°´Ù.
.
.
.
if(bind( server_socket, (struct sockaddr*)&server_addr, sizeof( server_addr))==-1)
{
fputs("bind() error!\n", stderr);
exit( 1);
}
.
.
.
struct sockaddr_in server_addr;
memset( &server_addr, 0, sizeof( server_addr);
server_addr.sin_family = AF_INET; // IPv4 ÀÎÅÍ³Ý ÇÁ·ÎÅä·Ñ
server_addr.sin_port = htons( 4000); // »ç¿ëÇÒ port ¹øÈ£´Â 4000
server_addr.sin_addr.s_addr = htonl( INADDR_ANY); // 32bit IPV4 ÁÖ¼Ò
ÇÏÁö¸¸ À§ ¿¹Á¦ÀÇ ÆÄÀ̽ã ÄÚµå´Â Có·³ º¹ÀâÇÏÁö ¾Ê´Ù.
C·Î ¼ÒÄÏÀ» ¹è¿î ÇÊÀÚ´Â ÆÄÀ̽ãÀÌ °£°áÇÑ °É º¸°í
"Ȥ½Ã, ÆÄÀ̽ãÀÌ ·Î¿ì ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö°ú °°Àº °É Áö¿øÇÏÁö ¾Ê³ª?"¶ó°í
»ý°¢ÀÌ µé¾ú´Ù.
±×¿¡ ´ëÇÑ ÇØ´äÀº ¾Æ·¡ÀÇ ¸µÅ©¿¡¼ º¼ ¼ö ÀÖ´Ù.
https://docs.python.org/ko/3/library/socket.html
- ¿¬°á ´ë±â -
server_socket.listen(5)
listen¾ÈÀÇ 5¶ó´Â ÀÎÀÚ´Â ¿¬°á´ë±â Æ÷Æ®¸¦ 5°³¸¦ ¸¸µç´Ù.
ÆÄÀ̽㠼ÒÄÏ ÇÁ·Î±×·¡¹Ö¿¡¼ listen() ÇÔ¼ö´Â
¼¹ö ¼ÒÄÏÀÌ Å¬¶óÀ̾ðÆ®ÀÇ ¿¬°á ¿äûÀ» ¹Þ¾ÆµéÀÏ ¼ö ÀÖ´Â »óÅ·Π¸¸µé¾îÁÖ´Â ÇÔ¼ö´Ù.
ÀÌ ÇÔ¼öÀÇ ÀÎÀÚ°ªÀº ´ë±â¿ÀÇ ±æÀ̸¦ ³ªÅ¸³½´Ù.
ÀÌ ´ë±â¿Àº µ¿½Ã¿¡ ¼ö¿ëÇÒ ¼ö ÀÖ´Â ¿¬°á ¿äûÀÇ ÃÖ´ë °³¼ö¸¦ °áÁ¤ÇÑ´Ù.
´ë±â¿ÀÌ °¡µæ Âù »óÅ¿¡¼ Ŭ¶óÀ̾ðÆ®°¡ ¿¬°áÀ» ½ÃµµÇϸé
¼¹ö´Â ¿¬°áÀ» °ÅºÎÇÏ°Ô µÈ´Ù.
ÀϹÝÀûÀ¸·Î´Â ´ë±â¿ÀÇ Å©±â¸¦ ¼¹öÀÇ ¿¹»ó 󸮷®°ú
½Ã½ºÅÛ ÀÚ¿ø¿¡ µû¶ó ÀûÀýÈ÷ Á¶ÀýÇÏ¿©¾ß ÇÕ´Ï´Ù.
- ¿¬°á ¼ö¿ë -
server_socket.accept()
¼¹ö ¼ÒÄÏÀÌ Å¬¶óÀ̾ðÆ®ÀÇ ¿¬°á ¿äûÀ» ¹Þ¾ÆµéÀÌ°í
ÇØ´ç ¿äû¿¡ ´ëÇÑ ¿¬°á ¼ÒÄÏ°ú Ŭ¶óÀ̾ðÆ®ÀÇ ÁÖ¼Ò¸¦ ¹ÝȯÇÏ´Â ÇÔ¼ö.
ÀÌ ÇÔ¼ö´Â Ŭ¶óÀ̾ðÆ®°¡ ¼¹ö¿¡ ¿¬°áµÇ±â¸¦ ±â´Ù¸®°í ÀÖ´Â »óÅ¿¡¼ È£ÃâµÈ´Ù.
È£Ãâ ½ÃÁ¡¿¡¼ Ŭ¶óÀ̾ðÆ®°¡ ¿¬°á ¿äûÀ» º¸³»¸é
accept()´Â ¿¬°áµÈ ¼ÒÄÏ°ú Ŭ¶óÀ̾ðÆ®ÀÇ ÁÖ¼Ò¸¦ Æ©Ç÷Π¹ÝȯÇÑ´Ù.
¹ÝȯµÈ ¼ÒÄÏÀ» ÅëÇØ ¼¹ö¿Í Ŭ¶óÀ̾ðÆ® °£ÀÇ Åë½ÅÀÌ ÀÌ·ç¾îÁø´Ù.
¸¸¾à ¿¬°á ¿äûÀÌ ¾øÀ» °æ¿ì,
ÀÌ ÇÔ¼ö´Â Ŭ¶óÀ̾ðÆ®ÀÇ ¿¬°á ¿äûÀÌ µµÂøÇÒ ¶§±îÁö ºí·ÎÅ·µÈ´Ù.
|
Hit : 716 Date : 2024/05/26 11:11
|