프로그래밍/의문
-
asio udp client 작업 중 람다 캡처를 잘못 사용한 문제프로그래밍/의문 2015. 7. 14. 18:51
123456789101112131415161718void UdpClient::Send(const ip::udp::endpoint& endpoint, const void* source, size_t bytes){ std::vector sendBuffer; sendBuffer.resize(bytes); std::memcpy(sendBuffer.data(), source, bytes); socket.async_send_to( buffer(sendBuffer.data(), sendBuffer.size()), // send data endpoint, [this, buf = std::move(sendBuffer)](const boost::system::error_code& error, size_t bytes){ /..
-
수신 오류로 착각한 송신 오류프로그래밍/의문 2015. 6. 10. 05:18
// 2015/06/10 ReceiveStream에서 오류가 있어서 콜백함수 호출때 프로그램이 뻗는 오류가 발견되었다.(오류0)// 오류0에 대한 해결: OnSessionReceive에서 데이터를 처리하고 세션으로 다시 Send를 하는데 그 부분에서 오류가 있었다. 메모리의 잘못된 사용으로 인한 오류였다. 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 void Session::Receive() { // /** @note: Receive 함수의 구현 중점(2015/06/05) * 0. 데이터의 복사를 최소화: Receive 버퍼를 그대로 이용할 수 있다면 그대로 이용한다. * 1. 신경 쓸 필요 없는..
-
서버 코딩 중 있었던 수신 직후 소켓이 닫히던 버그프로그래밍/의문 2015. 5. 25. 03:23
12345678910111213141516171819202122232425262728293031323334void User::CheckIoError(int result){ if (result == SOCKET_ERROR) { // ERROR_IO_PENDING 오버랩 연산이 성공적으로 시작되었으나, 나중에 완료될 것. const auto error = WSAGetLastError(); if (error != WSA_IO_PENDING) // * 이 부분이 error = WSA_IO_PENDING으로 되어있었다. {// 여기에 걸리면 진짜 오류다. this->Close(); /* WSAECONNABORTED 10053 타임아웃 혹은 상대방의 접속종료들과 같은 소프트웨어적인 문제로 연결이 끊겼음. WSAEC..
-
C++ 서버 프레임워크 제작 중 연산자 재정의로 인해 발생한 버그프로그래밍/의문 2015. 5. 23. 23:20
123456789101112131415161718void User::Receive(){ DWORD recvBytes; DWORD flags = 0; SOCKET s = m_socket; auto bytesTransferred = WSARecv( m_socket,//m_socket.GetNativeSocket(), &m_receiveBuffer.wsaBuffer, 1, &recvBytes, &flags, &m_overlapped, NULL); // ...}Colored by Color Scriptercs 문제는 저 부분이었다. m_socket. 여기서 m_socket의 정의는 Nelta::StreamSocket m_socket이다. StreamSocket은 윈도우 소켓을 다루는 게 서툴렀던 내가 TCP 소..
-
컴파일러 경고 warning C4127프로그래밍/의문 2015. 3. 20. 05:53
무한 루프, 즉 while(true){ ... } 를 하려고 했는데 그때 위험 경고 warning C4127이 발생했다. 컴파일러 경고 수준을 4로 해놓으면 발생하는 거 같은데 다음과 같이 우회하여 경고를 지울 수 있다 123456789while(true) // warning! C4127{ // break;} for(;;) // ok{ // break;} MSDN에 저렇게 우회를 할 수 있다고 하는걸 봐선 무한 루프를 사용할 때에는 while, 또는 do while이 아닌 for(;;)를 권하는 건가 싶다. 오류 메시지조건식이 상수입니다. conditional expression is constantwhile 루프 또는 if 문의 제어 식이 상수로 계산됩니다. 루프가 중간에서 종료되어 while 루프의 ..
-
코딩 스타일은 개발자의 지문프로그래밍/의문 2015. 2. 12. 18:18
공백이나 탭의 규칙, 파스칼, 카멜, 스네이크, 헝가리언 표기법 등의 네이밍 컨벤션, 주석의 위치.프로그래밍 코드 작성은 개발자마다 스타일도 제각각인데, 때문에 소스 코드만 봐도 얼추 누가 작성한 것인지 파악 가능하다. 미국 드렉셀대학과 메릴랜드대학, 프린스턴대학, 독일 괴팅겐대학의 공동 연구에 따르면 코드 분석을 통해 개발자를 95% 정확도로 가릴 수 있다고 한다. 해석 과정은 레이아웃과 어휘 특성, AST(Abstract Syntax Tree)을 거친다.이 중 AST는 코드 형태 특성을 파악하는 것으로, 함수 이름과 코멘트, 공간 배치 등 개발자의 버릇을 열쇠로 삼는 것이다. 연구팀은 개발한 소프트웨어를 통해 구글코드잼(Google Code Jam)에 공개된 코드 분석을 시도했다. 결과는? 코드 63..
-
32비트 OS(운영체제)에서 64비트 OS로 바꾸면 성능이 꼭 향상만 될까?프로그래밍/의문 2015. 2. 4. 18:08
꼭 그렇지는 않다. 64비트의 넓은 주소 공간은 성능을 떨어뜨리는 요인이다. 포인터가 4바이트에서 8바이트로 커지고, 일부 변수는 크기가 커지기도 한다. 변수의 크기가 늘어났다는 것은 메모리 소요량이 커졌다는 것과 같아서 캐시, 레지스터의 공간을 더 빠르게 소모하게 되므로 이런 부분에서 성능 저하가 일어난다. struct s{ int* ptr[8];}; 구조체 pod가 32비트로 컴파일이 된다면 4(size of 32bit ptr)*8 의 사이즈로 총 32바이트를 차지하므로 64바이트 캐시라인 하나에 구조체가 두 개 들어갈 수 있지만, 64비트로 컴파일이 되면 크기가 2배로 되고 캐시라인에 하나의 구조체밖에 들어가질 못한다. 따라서 이러한 메모리 점유율 증가는 오히려 프로그램의 구동 성능을 떨어뜨릴 수 ..