묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
recv() 함수가 아무 응답도 보내지 않는 이유는 무엇인가요?
break point를 통해 echo server 과정을 조정하던 중 send()를 보낼 때 ack 응답이 돌아온다는 것을 알게되었습니다.저는 recv()로 데이터를 받아 ack 응답을 보내는 줄만 알았는데 아니였더군요...recv()로 응답하지 않는다면 데이터가 제대로 전송되어 버퍼에 저장되었음을 알 수 없는 것 아닌가요?send()에서만 응답 받았음을 알리는 이유가 궁금합니다.
-
해결됨Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
send, recv 함수
char buf[] = "data"; int sendSize = 0; int total = 0; while ((sendSize = send(socket, buf + total, sizeof(buf) - total, 0) > 0 && total < sizeof(buf)) { total += sendSize; }데이터를 송수신할 때 송수신 함수는 주고받고 싶은 만큼의 데이터가 모두 전달되지 않더라도 완료될 수 있으니까데이터를 송수신할 때는 한 번의 함수호출이 아닌 위와 같이 여러 번의 함수호출로 완전한 데이터 송수신을 하는 게 맞나요??(코드는 송신할때의 상황이지만 수신도 서로 약속한 길이의 데이터를 주고받을 때 마찬가지인지 궁금합니다.)
-
해결됨Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
소켓에 대한 질문드립니다.
강사님. 항상 강의 잘 보고 있습니다.궁금한게 있어서 질문 드립니다.제가 이해하기론 클라이언트가 하나 연결될 때마다 서버는 새로운 소켓을 만들고 거기에 클라이언트를 연결한다?로 이해하고 있는데요.만약 제가 이해한 것이 맞다면 새로 만들어진 소켓에 새 포트번호가 매핑되서 클라이언트랑 통신을 해야할 것 같은데 wireshark로 확인해보면 25000로 클라이언트와 통신을 하고 있어서요.제가 놓친 것이 무엇인가요?
-
해결됨Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
RUDP 질문드립니다
게임 서버 같은 경우에 RUDP를 이용하는 방식이 듣고보니 되게 좋은 것 같아서 구현하려고 하는데 생각 이상으로 고려해야할게 너무 많아서 혹시 저런 것을 구현하는 이론이 있을까요?
-
해결됨Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
클라이언트가 먼저 연결종료를 해야한다고 하신부분 질문입니다.
클라이언트가 만약 소켓 연결을 정상 종료하지 않고 프로그램을 끄게 되는 경우 예컨데 정전으로 인해 클라이언트 PC가 종료됐다면 서버는 알턱이 없으니 결국 TimeOut을 체크해서 서버가 연결을 종료해야할 것 같은데 맞을까요?제 생각엔 위와 같은 흐름으로 진행되고 다른 방법은 떠오르지 않는데 혹시 대응할 수 있는 방법이 있을까요?
-
해결됨Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
질문있습니다
채팅 서버 코드 상에서 쓰레드를 생성한 직후 바로 CloseHandle함수를 호출하여 쓰레드 핸들을 해제해주는 부분이 있는데 쓰레드의 동작이 완료되기 전에 CloseHandle을 해줘도 문제가 없나요??리스닝 소켓과 accept함수로 생성된 소켓의 포트 번호가 25000으로 netstat와 wireshark 상으로 보면 동일하게 나오는데 여러 개의 소켓이 하나의 포트 번호를 공유할 수 있나요?? 아니면 netstat와 wireshark의 편의 기능인가요?? accept하면 랜덤한 포트번호를 할당받아서 소켓에 부여한다고 알고 있어서 질문드립니다 ㅠ리스닝 소켓도 버퍼가 있나요??shutdown(hSocket, SD_BOTH);로 리스닝 소켓을 shutdown해주고 나서 accept를 해봤는데 클라이언트의 접속이 잘 되더군요. 리스닝 소켓의 shutdown은 아무런 효과가 없는 건가요??클라이언트와 연결돼있는 상태에서 closesocket(hSocket);을 해서 리스닝 소켓을 해제해봤더니 서버에 연결돼있는 모든 클라이언트에게 RST가 보내졌습니다.그럼 서버가 종료될 때 클라이언트 연결을 끊으려고 모든 클라이언트 소켓들을 순회하면서 closesocket을 해주는 대신 리스닝 소켓하나만 closesocket을 해주는 방식을 써도 될까요??
-
해결됨Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
TCP_NODELAY 옵션
TCP_NODELAY 옵션을 주면 입출력 버퍼를 사용하지 않는다고 하셨는데 입력 버퍼도 사용하지 않나요??맞다면 보내는 측의 send()와 받는 측의 recv()가 1:1 매핑이 되는 건가요?? ( 받는 측에서 TCP_NODELAY 옵션을 줬다면 )
-
해결됨Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
질문있습니다
1. send()함수는 패킷을 보내는 함수가 아니라 소켓의 출력 버퍼에 데이터를 쓰는 것이고, recv()함수는 소켓의 입력버퍼에서 데이터를 읽어들이는 거라고 보면 될까요?? 데이터를 모아서 한번에 패킷을 보내는 것이 패킷의 갯수를 줄여서 성능 상의 이점이 있다는 건 알겠지만 데이터를 받을 때도 입력 버퍼에서 모아놓았다가 한번에 읽어들이는 것이 좋다는 것은 잘 모르겠네요...ㅠㅠ데이터를 받을 때 패킷을 보낼 때와 마찬가지로 일정 시간 대기해서 데이터가 쌓이도록 한 다음 읽어들인다는 건가요??
-
해결됨Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
IOCP에서 WSASend 사용 관련 및 시간 소요 요청 처리
먼저 좋은 강의 감사드립니다.IOCP를 사용 시 채팅서버에서 수신의 경우는 WSARecv를 사용하였으나, 송신은 일반 send 함수를 사용하고 있습니다.송신의 경우 WSASend를 사용하는 것이 send를 사용하는것 대비 장점이 없는 것인지요?WSASend 사용 관련하여 해당 함수를 사용해야 하는 상황에 대해 설명 부탁드립니다.추가로 IOCP의 thread (GQCS)에서 처리하는 일이 시간이 소요되는 처리를 해야 하는 시나리오 (파일 송신 등)에서, 사용자 수가 증가하는 경우 할당할 수 있는 thread가 없어, 동시 접속이 늘어나는 경우 문제가 발생할 수 있을 것으로 판단됩니다. 이런 경우 어떻게 설계를 하는 것이 타당한지 의견을 구하고자 합니다.감사합니다.
-
해결됨Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
IOCP의 WSAOVERLAPPED 구조체 상속에 관해서..
안녕하세요 IOCP 관련 자료를 찾아보던 중 WSARecv/WSASend 할 때 넣어주는 WSAOVERLAPPED 구조체를 상속한 사용자 구조체를 넘겨주는 경우를 봤습니다. 이렇게도 사용이 가능하다면 WSAOVERLAPPED 를 상속받았으니 호환 될 것이고 추가적인 데이터도 담을 수 있어 도움이 되겠다는 생각입니다.하나 궁금한 것이 있는데요 IOCP를 이용해서 넘긴 WSABUFF의 메모리영역은 커널에 의해 보호 받는다고 알고 있습니다. 마찬가지로 WSAOVERLAPPED 구조체도 커널에 의해 메모리 관리가 되는지 만약 관리가 된다면 상속을 통해 추가적으로 들어가는 정보도 관리에 포함이 되는지 궁금합니다감사합니다~
-
해결됨Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
메일 질문있습니다
5/31 이벤트 유튜브 영상 (https://youtu.be/3rpEsV0vnB8) 보고서선생님께 메일 보냈었는데메일이 안 간건지보낸 메일 주소가 잘못된건지보낸 방식이 잘못된건지 답변을 못 받았습니다.어떤 메일 주소로 어떻게 캡쳐해서 보내드리면 될까요?
-
해결됨Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
Callback 기반 비동기 파일 입/출력 질문
안녕하세요 수업 잘 듣고 있습니다 감사합니다. Callback 기반 비동기 파일 입/출력 부분에 질문이 있습니다. 만약 IoThreadFunction 함수에서 다수의 WriteFileEx 를 호출하고 콜백을 모두 같은 FileIoComplete 함수로 받는상황이 있을경우 테스트 해보니 하나의 파일 IO만 완료되도 SleepEx 가 통과되는 상황이 발생하는데요 이경우 만약 모든 콜백을 받길 원하면 구조적으로 스래드 하나당 하나의 WriteFileEx를 호출하도록 하거나 별도로 이벤트를 이용해서 처리하거나 하는 방법이 떠오르긴 한데 이방법이외에 다른 방법도 있을까요??
-
해결됨Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
입/출력 비동기 처리 순서 문제
이벤트 기반 파일 입/출력 강의에서 예제를 통해 프로세스가 요청한 작업의 순서와 운영체제가 실제로 해당 작업들을 처리하는 순서가 달라질 수 있다는 것을 보여주셨습니다.저는 이 예제의 결과를 보면서 프로세스에서 요청한 작업들이 커널 레벨의 큐에 순차적으로 삽입된다고 하더라도, 결국 운영체제도 큐에서 꺼낸 작업들을 비동기로 처리한다는 것으로 이해했는데요. 서로 다른 작업들을 비동기로 처리하기 위해서는, 결국 각 작업들이 서로의 완료 여부와는 관계 없이 독립적으로 수행되기 위해 멀티 Threading과 같은 방식을 처리될 것으로 예상됩니다.궁금한 점은 여기서 생겨났는데요, 이렇게 최종 작업마저 비동기로 처리하게 되면 I/O 작업의 순서가 꼬여 프로세스 입장에서 기대하는 파일의 최종 상태와 실제로 모든 작업을 끝마친 파일의 상태가 달라지는 경우가 발생할 수 있지 않나요?만약에 발생하지 않는다면, 왜 발생하지 않는지 궁금합니다.
-
해결됨Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
tcp 통신 관련하여 질문드립니다
안녕하세요 선생님~tcp 관련해서 질문을 드리고 싶습니다. ^^tcp 버퍼라는게 따로 존재하나요? 아니면 소켓 버퍼가 곧 tcp 버퍼인가요?segmentation된 데이터는 어디서 조립되나요? 만약 소켓 버퍼에서 조립된다면 recv했을 때 덜 조립된 데이터를 받거나 하진 않는지 궁금합니다.관련 책에서 본 내용인데요, 송신 버퍼에 1바이트의 여유만 있어도 tcp는 send가 가능하다는데 이러면 데이터가 다른 관련없는 데이터와 섞여서 송신되거나 하지는 않나요?다른건 안그러는데 이상하게 네트워크 쪽만 공부하면 자꾸 깊게 파고들려고 하네요. ;;호기심을 적당히 가져야 진도를 빠르게 뺄텐데... 그래도 좋게 생각해야겠죠? ㅎㅎ항상 좋은 강의 감사드립니다~^^
-
해결됨Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
Wireshark을 어떻게 분석해야 하나요?
안녕하세요 선생님^^강의를 보면서 Wireshark 분석도 따라해보고 있는데요,제가 루프백 환경에서 진행을 하고 있어서 그런지 뭔가 뒤죽박죽 같더라구요특히 14번 패킷은 아무데서도 Ack=5가 안나왔는데 Seq=5를 보내니까저로서는 도저히 뭐가 뭔지 모르겠어서.. ㅠㅠ;;어디서부터 실마리를 잡아야 할까요..?분석 관련해서 조언을 얻고 싶습니다!!
-
해결됨Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
Windows 프로젝트 만드는 방법
안녕하세요~ IOCP까지 강의를 들으면서 예제들을 다운로드 하면서 실행하고 이해하고 하였습니다. 예제들인, Windows 프로젝트를 다운로드해서 실행하는 방식 말고, 직접 손 코딩이 하고 싶어 만들려고 하니, 오류도 나고 뭐가 뭔지 잘 모르는 부분이 있어 남겨봅니다. 일단 저가 시도 한 부분 적어보고, 수정해야 할 부분 피드백 부탁드립니다.(아니면 그냥 순차적으로 전체적으로 하는 방법 설명해주셔도 됩니다.^^)첫번째로. Windows 데스크 톱 마법사에서 데스크톱 애플리케이션 미리 컴파일된 헤더만 클릭하였습니다.두번째로 미리 컴파일된 헤더 추가하는 방법 링크 https://hungrysoul9.github.io/2019/09/26/add-vs-pre-complied-header/ 처럼 stdafx.cpp 추가하고 stdafx.h 해서 뭘 어떻게 해야되는지 모르겠고,->여기서 조금 헤더파일 pch관련된 부분 수정하고 ctrl+f5 누르면(심각도 코드 설명 프로젝트 파일 줄 비표시 오류(Suppression) 상태오류 LNK2019 WinMain@16"int _cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 함수에서 참조되는 확인할 수 없는 외부 기호 IOCP_chat D:\C++\IOCP_chat\MSVCRTD.lib(exe_winmain.obj) 1오류 LNK1120 1개의 확인할 수 없는 외부 참조입니다. IOCP_chat D:\C++\IOCP_chat\Debug\IOCP_chat.exe 1)다음과 같은 오류가 뜹니다..따라서 ->https://pang2h.tistory.com/156링크를 참조해서 속성 링커에 시스템에 하위 시스템을 콘솔 또는 지우니까 해결이 되었는데,,,이렇게 만들어 지는 건가요?해결이 되었다면 되었는데,,C/C++과는 다르게 Windows 프로그래밍은 처음이라,, 어떻게 프로젝트를 만들어야 하는지 정리 한번 부탁드립니다. 또는 맞게 잘 하였다면,, 피드백 부탁드립니다. 감사합니다.(질문 등록하고 수정하고 한 글입니다...^^)
-
해결됨Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
IpConfigSample 예제 NIC free 개선 필요합니다
IpConfigSample 마지막 부분에 free 개선이 필요합니다.pNicInfo가 NULL 이므로 free 는 do nothing 중입니다. while(pNicInfo != NULL){ /* Do somethings */ pNicInfo = pNicInfo->Next; } // while loop 벗어난 시점이므로 pNicInfo == NULL free(pNicInfo); // pointer 가 NULL 이므로 free 는 donothing
-
해결됨Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
Ctrl-C 구현 내용 중 return True; 에 관하여
exit(0);다음에 return TRUE; 까지 도달하지 못 할텐데, 이건 업계의 코딩스타일 관행같은 건가요?아니면 제가 수업중에 졸은걸까요 ㅜㅜ
-
미해결Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
실습 템플릿 선택
실습 코드를 직접 작성해보면서 연습해보고 싶은데빈 프로젝트로 만들어보면 예제 코드랑 구성이 다른 것 같던데혹시 빈 프로젝트 말고 다른 템플릿을 사용해야 하는건가요? _tmain 이런것도 처음봐서 헷갈리네요..구글링 해 보니까 _tmain을 쓰려면 tchar.h헤더를 불러와야 한다는데 예제 코드에서는 그렇지도 않으니 검색한게 맞는건가 잘 모르겠네요 ㅠㅠ..그냥 main 써도 상관 없는걸까요?==========================내용 추가 =======================말로 설명을 어떻게 해야 할지 몰라서 그림으로 질문드리겠습니다 ㅠㅠ아래 그림 중 왼쪽은 제가 만든 프로젝트 파일에 들어간 모습이고,오른쪽은 선생님 예제 코드 파일 열었을 때 모습입니다. 저는 새 프로젝트 만들기 -> 빈 프로젝트로 시작하였는데, 이렇게 시작하면 안되는 건지에 대한 질문이었습니다.
-
해결됨Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
IP주소 개수, Listen과 Accept 사이에서 연결 요청
TCP 에코 서버 제작 : 클라이언트 연결 받기 및 통신 수업에서포트 바인드 코드 설명에서 NIC이 여러개 있으면 IP주소도 여러개 있을 수 있다고 하셨는데, NIC의 개수와 비례해서 IP주소도 늘어나는 것인가요? 예를들어 NIC이 3개이면 IP주소도 항상 3개인 것인지. 아니면 그 이상 또는 이하로 IP주소를 가져도 상관 없는건지 궁금합니다.Listen 코드 설명에서 1번 클라이언트가 접속을 요청하고 Accept 처리까지 끝나서 ~~하는 과정에서 다른 클라이언트가 접속을 요청하면 요청 자체가 날아가서 접속이 안된다 라고 하셨는데, 이때 날아가는 요청은 1번 클라이언트의 요청인지 아니면 다른 클라이언트의 요청인지 궁금합니다.