-
23/11/23 네트워크 프로그래밍 #멀티캐스트 실습Computer Engineering 2023. 11. 23. 10:45
라우터 ( 물리, 데이터링크, 네트워크 , ip ) 까지 전송계층은 존재하지않음
그래서 메소드에서 ip관련 옵션을 선택할 수밖에 없다파일 : 12주차
5P 브로드캐스팅
Setsockopt() 메소드에서 IPPROTO_IP 관련 optionTTL ( 중요한 옵션 ) 생존기간. 일반적인 아이피 헤더중에도 존재하는데
- 특정네트워크 모든 - 브로드 캐스트
- 그룹에 가입된 호스트에게 = 멀티캐스트멀티캐스트 범위 : 224.0.0.0 ~ 239.255.255.255 범위 ( 최상위 비트가 1110 이므로 )
저장 공간 16bit
IP_MULTICAST_TTL
그룹팩이라는 함수 이용해 지정
파이썬 struct정보를 전송하는 사람은 구태여 그룹에 속하지 않아도 됨
자신도 정보를 받을 것인가? loop = false ( 혼돈이 될 수 있으니 자신이 보낸 메시지 수신 방지 )소켓 주소 : IP주소, + 포트 넘버 = group_addr
datagram 소켓을 만들고
타임아웃
TTL = struct.pack(@i', 2 ) 2바이트의 정수형으로 표현, 문자형일 수있고, 일반적으로 4바이트 정수형, @integer
s_sock.setsockopt()
while: True:
udp 니까 sendto !
encode() 네트워크 바이트로 변화
sendto는 주소에 따라서 상관없지, 보내는이장에서는 유니캐스트랑 똑같다 ??14P 멀티캐스팅 수신
송신은 네트우크 가입하지않고 보낼 수 있지만,
받기 위해서는 멀티캐스트 그룹을 가입해야한다.
- sock.setsocket(IPPROTO_IP, IPADD_MEMBERSHIP, 그룹주소 )# 수신 메시지 Receiver from socket import * import struct BUFFER =1024 group_addr = "224.0.0.255" r_sock = socket(AF_INET, SOCK_DGRAM) r_sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) r_sock.bind(("",5005)) mreq = struct.pack("4sl", inet_aton(group_addr),INADDR_ANY) r_sock.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq) r_sock.setsockopt(IPPROTO_IP, IP_DROP_MEMBERSHIP, mreq) print("Ready to receive") while True: rmsg, addr = r_sock.recvfrom(BUFFER) print("Received{}from({},{})".format(rmsg.decode(), *addr)) r_sock.sendto('ACK'.encode(), addr) #응답 전송
#송신프로그램 Sender # 일반과 똑같은데, 보내는 것만 ! from socket import * import struct group_addr= ("224.0.0.255", 5005) #group address s_sock = socket(AF_INET, SOCK_DGRAM) #datagram socket 사용 # UDP 소켓 만듬 s_sock.settimeout(0.5) TTL = struct.pack('@i', 2) #TTL=2. # 디폴트값 16인가 32 아니면 지정해줘야함 # 4바이트 정수형으로 표현 s_sock.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, TTL) s_sock.setsockopt(IPPROTO_IP, IP_MULTICAST_LOOP, False) # 나한테 되돌아오는것 디폴트값 true while True: rmsg = input('Your message:') # 프롬프트 s_sock.sendto(rmsg.encode(), group_addr) #멀티캐스트 메시지 전송, 네트워크 주소로 바꿈 while True: try: response, addr = s_sock.recvfrom(1024) #모든 수신자로부터 응답 수신 except timeout: #타임아웃 예외 발생 break else: print('{} from {}'.format(response.decode(), addr)) #응답 출력
수신에서 받는 건 임시 포트넘버라서 다른거고
5005는 well-known port numberIP주소
브로드캐스트 네트워크주소 : 255 를 주로 쓴다.
특정 그룹에 속한 사람만 데이터를 보내게 된다. 하는 것을 인지!
12. 동시성 concurrent 소켓 프로그래밍
반복 서버 ( iterative server )
- 클라이언트의 요청을 하나씩 서비스하는 서버 프로그램
- A가 서비스 받고 있는 동안에 B는 대기병행서버 concurrent server
: 하나의 서버 프로그램이 여러 클라이언트들을 동시에 서비스 가능
- 이벤트 구동방식 : 클라이언트 접속 요청이나 데이터 수신 등의 이벤트가 발생하면 처리하는 방식- 스레드 : 전담마크 , 아바타가 있어서 1ㄷ1로 대응
- 스레드방식 : 클라이언트마다 별도의 스레드 사용 : 멀티스레드22P TCP 멀티스레드 서버
스레드 thread란?
- 운영체제에 의해 시간이 배분되고 관리되는 프로그램 실행 단위
- 여러 스레드들을 운영체제가 적절히 스케줄링함으로써 동시성 지원
- 스택, 데이터 메모리 등을 공유
- 스레드를 생성하고 스레드에게 함수의 실행을 맡기면 사용자 개입이 필요없음
- 메인 스레드는 클라이언트를 연결하고 데이터 처리는 스레드를 생성하여 서브 스레드에게 맡긴다.프로세스는 자체 스택, 메모리를 가지고있고
스레드는 스택, 메모리를 공유한다.cpu의 분배가 가장 큰 운영체제의 역할 ( 자원의 분배 job scheduling )
context switching
os에게 스레드를 처리해달라고 요청하면 됨
< 메인 스레드 > 클라이언트 접속시 소켓하나 만들어주고, 접속한 클라이언트와 실행시킬 수 있는 서브 스레드 생성, 스탙
스레드 실행은 os가 하니까.
서브 스레드 1, 서브 스레드 2, 서브 스레드 3TCP 멀티스레드 서버
< 멀티스레드 구현 방법 >
1. _thread 모듈 사용
2. threading + subclass 사용
3. threading.Thread() 함수 사용
4. concurrent.future 모듈 사용무한루프의 개수 = 스레드 개수
1) _thread 모듈 사용한 멀티스레드 구현
- 메인 스레드로 실행되는 main 함수에서 서브 스레드 생성하고 인자와 함께 handler() 함수 지정한다.
- 서브 스레드 생성과 실행
1. _thread.start_new_thread(2 hander, 3 ( clientsock, addr ))
1. 서브 스레드를 생성하고 실행
2. 서브 스레드로 실행할 함수
3. 함수로 전달할 인자메인 스레드 -> 서브 스레드
main 함수 handler() 함수'Computer Engineering' 카테고리의 다른 글
23/11/21 네트워크 프로그래밍 # 브로드 캐스팅 (1) 2023.11.21 교착상태(데드락)이란? (0) 2023.06.18 프로세스의 상태와 계층 구조 (0) 2023.06.07