해결된 질문
작성
·
428
0
수업을 듣고 따로 서버코드를 만들어 보려는 중 잘 안돼서 질문 드립니다.
class Server {
private:
SOCKET listenSocket;
std::list<SOCKET> listClients;
SOCKADDR_IN serverAddr;
public:
Server();
Server(USHORT port, IN_ADDR addr);
void Bind();
void Listen();
DWORD WINAPI ThreadAcceptLoop(LPVOID pParam);
void AcceptClient();
void ReleaseServer();
~Server();
};
main 함수에서 Server클래스의 객체를 만들어서 서버를 실행하는 로직을 구현하고 있습니다.
Server클래스의 AccpetClient()에서 CraeteThread()를 사용하여 ThreadAcceptLoop()를 실행하는 쓰레드를 만들어서 클라이언트의 요청을 Accept()하려고 합니다.
하지만 CreateThread()함수에서 E0167 DWORD (__stdcall Server::*)(LPVOID pParam) 형식의 인수가 LPTHREAD_START_ROUTINE 형식의 매개 변수와 호환되지 않습니다. 라는 오류와 함께 컴파일이 되지 않습니다.
찾아본 결과 함수를 static으로 선언하던지 전역함수를 사용하라고 합니다.
제가 하려던것처럼 클래스의 멤버함수를 실행할 수는 없나요??
답변 2
1
윈도우 환경에서 클래스 멤버의 함수 호출 규칙은 __stdcall이 아니라 thiscall입니다. 따라서 CreateThread() 함수가 요구하는 규칙에 맞지가 않습니다. 이 문제를 해결하는 방법은...
클래스의 정적 멤버로 선언하거나
별도 전역 함수로 선언 하는 것
입니다.
결과는 이미 알아본 내용 그대로 입니다. 다른 방법은 없습니다. 참고하시기 바랍니다. :)
1
accept()를 스레드 만들어서 돌리시려는 이유가 있을까요?
https://stackoverflow.com/questions/10673585/start-thread-with-member-function
C++ thread 클래스 사용하면 멤버 함수를 멀티스레딩으로 돌릴 수 있는 것 같긴 하지만 괜찮은 사용인지는 의문입니다.
강의 내용 처럼 메인 스레드에서는 클라이언트 연결을 받고 그 클라이언트에 대한 처리를 멀티스레드로 돌리는 구조가 더 괜찮아 보입니다.