묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션
close() 메서드 사용 여부 질문 드립니다.
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 네 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 네[질문 내용]설명해주신 예제를 보니 메모리 스트림이나 콘솔 스트림에는 close()를 사용하지 않네요.ByteArrayStream나 PrintStream 같은 경우에는 메모리를 대상으로 하는 스트림이라 GC 대상이 되어서 따로 close() 메서드를 호출하지 않아도 되는 건가요?
-
해결됨외워서 끝내는 네트워크 핵심이론 - 응용
서울지사 DB Server 패킷 예시
해당 강의에 10분 쯤을 보면 선생님께서 다음과 같이 예시를 들어주셨습니다. 부산지사의 철수(ip 3.3.3.10)이 서울지사의 DB서버(5.5.5.100)으로 패킷을 보내면 IP 패킷이 다음과 같다.IP 출발지 : 3.3.3.10 도착지 5.5.5.100 여기서 궁금한 것은 DB서버의 5.5.5.100은 private한 주소일텐데 어떻게 해당 ip주소로 도착지 ip 주소 헤더가 설정될 수 있는지가 궁금합니다. 제 생각에는 다음 두 가지 경우 중 하나가 아닐까 싶은데 맞다면 어떤 것인지 아니라면 어떻게 되는지 가르쳐 주실 수 있을까요?ISAKMP를 이용하여 터널링 하는 과정에 서울지사와 부산지사의 private network가 하나로 통합되기 때문이다. 원래는 NAT 과정이 있으나 이해하기 쉽도록 돕기위해 다음과 같은 과정이 생략된 것이다.
-
해결됨20년 경력자의 알기쉬운 컴퓨터네트워크
안녕하세요 2계층과 4계층의 오류 제어에 대해 질문드립니다.
- 학습 범위를 넘어서는 개인적인 문의나 기타 회사 정책 및 운영에 대한 문의는 답변하지 않습니다. - 서로 예의를 지키며 존중하는 문화를 만들어가요. 2계층 장치인 스위치에서 프레임 전송 시 발생한 오류를 복원하거나 재전송한다고 하셨는데,4계층인 전송계층의 주요역할에도 오류 제어가 있어서혹시 그 둘의 오류 제어 차이점이 따로 있을까요?
-
해결됨이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
팀 프로젝트 시 클라이언트 파트와의 협업 방법
안녕하세요 교수님. 친구들과 현재 언리얼로 1대1 멀티플레이 게임을 제작하려고 있습니다. 저는 서버 쪽을 맡아 지금부터 공부해나가는 상황입니다. 하지만 아직 2강까지 밖에 안들은 시점이어서 그런지, 저희가 프로젝트를 진행할 때 어떤 식으로 협업을 하면 될지 머리에 그려지지 않습니다. 저희같은 소규모 팀에서는 클라이언트 / 서버 개발을 어떻게 나누어 진행하면 좋을지 조언 주실 수 있으실까요? 좋은 강의 제공해주심에 항상 감사합니다.
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
[클라 입장] 강의에서 빌드를 하면 오류가 발생합니다.
Server를 빌드하면 Server 프로젝트 내에 있는 Enum.pb.h 파일에서 이런 오류들이 발생합니다. 어떻게 해결해야 할까요?
-
미해결AWS Certified Cloud Practitioner 자격증 준비하기
현재 수업 끝에 비디오랑 오디오가 안맞는거 같은데요?! 많이 헷갈립니다!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
해결됨외워서 끝내는 네트워크 핵심이론 - 기초
단편화 과정에서 패킷을 수신할 때 질문
안녕하세요! 수업 잘 듣고 있습니다.다름이 아니라 TTL과 단편화 주제로 말씀하실 때 확인하고 싶은 과정이 있어서 질문 드립니다.수신 라우터가 기존 패킷보다 MTU가 작을 경우 segmentation이 일어나고, 이를 다시 합치는 것은 수신하는 서버에서 한다고 하셨는데 이때 말씀처럼 IP 즉 L3에서 분할 된 패킷을 합치고 L4로 보내기 위해 TCP에서 IP 헤더를 제거한다음 socket의 버퍼에 넣어뒀다가 app으로 보내는 것을 TCP에서 segment를 다시 조립한다고 말씀하신 걸까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
1:48 초에 패킷의 수 말씀하셨는데
일반적인 포트폴리오는 10~20개라이브에서는 100~200개면너무 적은 거 아닌가요? 스킬만 처리해도 되게 많은 패킷이 필요할 것 같은데일반화를 잘해서 패킷 구조 하나로도 많은 부분을 처리한다던지?.. 그런 건가요
-
미해결AWS Certified Solutions Architect - Associate 자격증 준비하기
수강기간 연장문의
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 선생님새로 이직을 준비하는 과정에 있어서 수강을 제대로 하지 못했습니다ㅜ 연장이 가능할까요,,
-
해결됨이해하면 인생이 바뀌는 네트워크 프로그래밍
[Ethernet 채팅 프로그램 개발] 이런것도 가능할까요?
[강의:Ethernet 채팅 프로그램 개발]안녕하세요. 선생님! 오랜만에 질문드리네요 ㅎㅎ강의 수강중 이렇게하면 해킹할수 있겠다? 라는 생각이들어 질문남깁니다![ 상황 ]특정 게임서버가 있습니다.게임서버에는 정의한 패킷이 1개가 있고 계정 ID를 받으면 관련된 DB 데이터를 변경하는 로직이 작성되어있습니다.여기서1) 게임서버에서 수신된 패킷이 해당 유저가 보낸게 맞는지? 패킷 암호화 처리 없음2) 게임서버에서 수신된 패킷의 계정 ID의 Session 데이터(연결정보)가 있는지? 체크하지 않음라고 했을때Ethernet/IP(게임서버 IP)/TCP(게임서버 Port)/Segment(정의한 패킷)를 수동으로 만들어서 보내면해킹처럼 게임서버에 내가아닌 다른 계정의 ID를 보내 처리하게 할수있겠다. 라고 생각이 들었는데요.Q. 네트워크딴에서 체크섬 말고는 따로 보안처리가 없는것같아 이런 시나리오가 가능한지 궁금합니다. 추가내용) 강의를 이어서 더 보니, 게임서버가 TCP통신을 하고있었다면 Seq까지 맞춰야하네요.(Seq번호가 맞지 않으면 게임서버의 운영체제 단에서 패킷 버려짐로 이해) 이러면 해킹하는게 힘들것같네요 ㅎㅎ
-
미해결그림으로 쉽게 배우는 네트워크
랜카드에서 CPU로 인터럽트가 발생 한 이후 과정
랜카드에서 CPU로 인터럽트를 보냈을 때 CPU는 포트번호로 프로세스로 데이터를 전달할 것 같은데요 이 과정이 저에게 블랙박스 인데 ...뭔가 힌트를 주실 수 있나요?
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
검색엔진에 대해서...
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]검색 엔진이라는 용어를 잘 이해를 못 하겠습니다. 일시적인 리다이렉션 부분에서 "검색 엔진 등에서 URL을 변경하면 안됨"이라는 글이 있는데 구체적 예시를 들어서 이 문장을 설명해 주실 수 있을까요??
-
미해결그림으로 쉽게 배우는 네트워크
클라이언트-서버 모델 데이터 전송 질문
강의 51초 질문드립니다. 클라이언트-서버 모델에서 유저1 -> 게임서버로 데이터를 전달한 것까지는 알겠습니다. 그런데, 게임 서버 -> 유저2, 유저3로의 전달은 어떻게 이뤄지는 건가요? 게임 서버에서 유저2, 유저3의 public ip와 port는 알고 있지만 private ip와 port는 모르지 않나요..?
-
해결됨인증서와 TLS
다음 준비 강의가 무엇일까요?
항상 좋은 강의 해주셔서 감사합니다. 혹시 다음 준비중인 강의가 무엇인지 알 수 있을까요? 감사합니다.
-
해결됨외워서 끝내는 네트워크 핵심이론 - 기초
DHCP 브로드캐스트에 대해 질문이 있습니다.
안녕하세요 선생님.DHCP 브로드캐스트에 대해 질문이 있습니다! DHCP 설정에는 기본적으로 4가지 단계가 존재한다.DHCP DiscoverDHCP OfferDHCP RequestDHCP Ack2번과 4번 과정에서 Flag 비트를 통해 Unicast or Broadcast 설정이 가능하다고 이해하고 있습니다. 여기서 한 가지 의문이 있는데, 유니캐스트만 사용하는 것이 아닌 브로드캐스트도 제공하는 이유? 입니다.2번과 4번에서는 클라이언트의 MAC 주소를 알고있기 때문에 1:1 통신인 유니캐스트를 통해 DHCP 서버 -> 클라이언트로 사용가능한 주소(IP, 게이트웨이, 서브넷 마스크 등)을 바로 전달하는게 효율적이지 않나요? 분명 이유가 있기 때문에 브로드캐스트도 지원하는 것 같은데... 이에 대해서 알려주실 수 있으실까요??? 감사합니다!
-
미해결그림으로 쉽게 배우는 네트워크
공유기 간 연결 네트워크 할당 관련 질문드립니다.
강의 46초 질문드립니다. 스위치와 허브로 구성된 많은 호스트를 의미하는 초록색 원에 10.0.0.0/8 네트워크가 할당된 것은 알겠습니다. 그런데, 라우터 간(노란색, 파란색 선) 연결에도 네트워크가 할당되나요? 예를 들어, 클래스A를 사용한다고 했을 때 각 초록색 원에 하나의 네트워크 주소를 할당하고, 공유기 간 연결에도 하나의 네트워크 주소를 할당하는 건가요..?
-
미해결CloudNet@ - Amazon EKS 기본 강의
eks 생성시 Control plane 질문
EKS 클러스터를 생성하여 Control plane을 만드는것으로 이해하였는데요. 실습에서 관리콘솔에서 EKS 클러스터 생성을 할때, VPC와 Subnet을 지정하더라구요. 이때 cloudformation으로 생성된 myeksVpc와 Subnet들을 지정하였는데, 이것을 지정하는것은 어떤것을 생성하는것인가요? AWS에서 관리하는 영역이라 Control Plane은 사용자가 핸들링할 수 없다고 설명하였는데, EKS 클러스터를 생성할때는 VPC와 Subnet을 지정하고.. 헷갈리는 부분입니다.
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
수강 계획 관련해서 질문드립니다!
[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버학습 완료 후루키스님 게임 서버 프로그래머 로드맵 따라가면 될까요?일단 저의 상태는 서버쪽 먼저 공부하고 싶은 마음이 크고 언리얼과 유니티 경험이 없습니다.[c++과 언리얼로 만드는 MMORPG]의 경우 part1에서 바로 part4로 넘어가고[c#과 유니티로 만드는 MMORPG] 강의에 경우에도 1, 4, 7로 구성되어 중간중간 비는 부분 때문에 어떻게 수강 계획을 잡을지 고민되어 질문드립니다!
-
미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
20m 반경을 지나면 분수대가 멈춰야 되는데 그냥 사라져버려요.
근데 또 가까이 가면 다시 생겨요.. 왜 이런걸까요
-
해결됨김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션
채팅 프로그램 구현완료 이후, 보완해야할거
[질문 내용]안녕하세요, 영한님 강의 잘 이용하고있습니다. 감사합니다.다름이아니라, 이번에 채팅프로그램을 구현하고나서 구현한 기능들에 대해서 보완할게 있는지 여쭤보고싶어서 글 남깁니다. 전체코드는 아래와 같습니다. ==================우선 구현한기능들은 잘 작동합니다./ 유저리스트 / 가입 / 메세지전송 / 메세지리드 / 제가 느끼기에는, 서버파일쪽에서 가독성이 크게 떨어지는거같은데 -> if / else / try / catch ... 때문에 ... 질문은 가독성 관련입니다.가독성? --> if / else if 쪽을 어떻게 보완해야 가독성이 높아질 수 있을까요? ( 메서드 ? ) =================== [ close() 부분쪽은 따로 해결 완료했습니다! ] 서버파일입니다.package chat; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; import static util.MyLogger.log; public class Server { public static final int SERVER_PORT = 12345; public static void main(String[] args) throws IOException { log("서버를 시작합니다. 포트 번호 : " + SERVER_PORT); ServerSocket serverSocket = new ServerSocket(SERVER_PORT); Thread acceptAndChat = new Thread(new AcceptThread(serverSocket)); acceptAndChat.start(); } static class AcceptThread implements Runnable{ public ServerSocket serverSocket; public AcceptThread(ServerSocket serverSocket) { this.serverSocket = serverSocket; } @Override public void run() { Socket socket = null; DataInputStream input = null; DataOutputStream output = null; while ( true ){ try { socket = serverSocket.accept(); Sockets.addSocket(socket); input = new DataInputStream(socket.getInputStream()); output = new DataOutputStream(socket.getOutputStream()); Thread chatThread = new Thread(new ChatThread(socket, input, output)); // 채팅관련 로직을 진행하는 스레드입니다. chatThread.start(); } catch (IOException e) { log("서버 연결 도중에 문제가 발생했습니다 : " + e.getMessage() + " 프로그램을 종료합니다."); try { output.close(); input.close(); socket.close(); serverSocket.close(); } catch (IOException ee) { log("자원정리도중 에러발생 : " + ee.getMessage()); } } } } } static class ChatThread implements Runnable{ public Socket socket; public DataInputStream input; public DataOutputStream output; public ChatThread(Socket socket, DataInputStream input, DataOutputStream output) { this.socket = socket; this.input = input; this.output = output; } @Override public void run() { String currentThreadName; List<String> threadsNames = new ArrayList<>(); boolean isFirst; while ( true ) { String received = ""; try { received = input.readUTF(); } catch (IOException e) { if ( e.equals("Connection reset") ){ log("사용자가 연결을 종료했습니다. 해당 사용자의 세션을 삭제합니다."); Sockets.removeSocket(socket); break; } log("클라이언트로부터 전송된 메세지를 받는도중, 에러가 발생했습니다 : " + e.getMessage()); break; } if ( received.equals("exit") ){ log("프로그램 종료 - 유저 요청"); break; } else if ( received.equals("list") ){ List<String> userNames = Users.getUserNames(); log("사용자가 목록 조회를 했습니다."); try { output.writeUTF(String.valueOf(userNames)); } catch (IOException e) { log("사용자 목록을 유저에게 보내는도중, 에러가 발생했습니다"); } } else { // 유저가 처음 채팅방에 입장했을때, 유저 닉네임을 참여자목록에 넣어주는 과정입니다. currentThreadName = Thread.currentThread().getName(); isFirst = threadsNames.contains(currentThreadName); if ( !isFirst ){ log("사용자 : " + received + " 님이 채팅방에 입장했습니다."); Users.addUserName(received); log("유저를 추가했습니다."); threadsNames.add(currentThreadName); System.out.println(threadsNames); log("스레드를 추가했습니다."); } // 유저가 입장하고나서, 메세지를 전송하면 서버가 메세지를 받아서 메세지를 Sockets 에 있는 Socket 들에 전송하는 과정입니다. else { log("클라이언트로부터 메세지가 도착했습니다 : " + received); // 메세지를 Sockets 에 있는 Socket 들에 전송 try { Sockets.sendMessage(received); } catch (IOException e) { log("서버에서 클라이언트로 메세지를 전송하는 도중, 에러 발생 : " + e.getMessage()); } } log("테스트"); } } } } } 클라이언트 파일입니다.package chat; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.util.Scanner; import static chat.Server.SERVER_PORT; import static util.MyLogger.log; public class Client { public static void main(String[] args) throws IOException, InterruptedException { Socket socket = new Socket("localhost", SERVER_PORT); // 서버와 연결 DataOutputStream output = new DataOutputStream(socket.getOutputStream()); DataInputStream input = new DataInputStream(socket.getInputStream()); Scanner scanner = new Scanner(System.in); System.out.print("/join 을 입력해서 채팅방에 입장하세요 :"); String toJoin = scanner.nextLine(); if ( !toJoin.equals("/join") ){ System.out.println("명령어를 정확하게 입력해주세요. 재시작합니다."); } else { System.out.print("채팅방에서 사용할 닉네임을 입력해주세요 : "); String userName = scanner.nextLine(); // 닉네임입력 -> 채팅방 입장 // 닉네임 -> 서버에 전송 -> 서버가 유저모음집에 유저닉네임을 넣어줌 log(userName + " 채팅방에 입장했습니다."); output.writeUTF(userName); Thread sendThread = new Thread(() -> { while ( true ){ System.out.print("전송할 메세지를 입력해주세요 ( 종료 : exit ) : "); String toSend = scanner.nextLine(); if (toSend.equals("exit")) { System.out.println("프로그램을 종료합니다."); return; } try { output.writeUTF(toSend); // 전송할 메세지를 서버에 전송 } catch (IOException e) { log("메세지 전송도중 에러발생"); } } }); Thread receiveThread = new Thread(() -> { while ( true ) { String received = null; try { received = input.readUTF(); } catch (IOException e) { log("메세지를 읽는도중 에러발생 : " + e.getMessage()); } log("메세지가 도착했습니다 : " + received); } }); sendThread.start(); receiveThread.start(); sendThread.join(); receiveThread.join(); } // 채팅 프로그램을 종료했으니, 자원을 정리하고 종료합니다. log("채팅 프로그램 종료, 자원을 정리하고 종료합니다."); input.close(); output.close(); socket.close(); } } ======= 아래 두개는 서버 / 클라이언트 파일이아닌 도움을 주는 파일입니다.서버와 클라이언트간에 소켓이 연결되고나서, 클라이언트 정보들이 담겨져있는 소켓들을 저장하는 공간입니다. package chat; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.util.HashMap; import java.util.Map; public class Sockets { private static Map<Socket, Boolean> sockets = new HashMap<>(); public static void addSocket(Socket socket){ sockets.put(socket, true); } public static void sendMessage(String message) throws IOException { for (Socket socket : sockets.keySet()) { DataOutputStream output = new DataOutputStream(socket.getOutputStream()); output.writeUTF(message); } } public static void removeSocket(Socket socket){ sockets.remove(socket); } public static Boolean getValue(Socket socket) { return sockets.get(socket); } public static boolean changeValue(Socket socket){ return sockets.get(socket); } } 채팅방에 접속한 유저들을 모아놓은 공간입니다.package chat; import java.util.ArrayList; import java.util.List; public class Users { private static List<String> userNames = new ArrayList<>(); public static void addUserName(String userName){ userNames.add(userName); } public static List<String> getUserNames() { return userNames; } }