CreateThread()를 사용하여 클래스의 멤버함수를 실행할 수 는 없나요?
수업을 듣고 따로 서버코드를 만들어 보려는 중 잘 안돼서 질문 드립니다.
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 클래스 사용하면 멤버 함수를 멀티스레딩으로 돌릴 수 있는 것 같긴 하지만 괜찮은 사용인지는 의문입니다.
강의 내용 처럼 메인 스레드에서는 클라이언트 연결을 받고 그 클라이언트에 대한 처리를 멀티스레드로 돌리는 구조가 더 괜찮아 보입니다.
recv, send 리턴값 질문
0
76
2
스타,워크와 같은 디스창 (Disconnected)도 비정상 종료에 대응하는 시스템으로 봐야할까요?
0
96
2
수업과 관련해서 읽어볼 만한 책 있나요?
0
111
1
서버가 끊어버리는것에 대한 질문
0
121
2
TCP 의도적 장애 테스트 질문
0
159
2
shutdown()을 호출하는 이유
0
164
1
프로토콜이 적용된 파일 송신 서버에서 send, recv 질문 있습니다!
0
152
2
"파일 송신 서버 제작" 강의 질문입니다!
0
151
2
대표적인 장애 유현 2
0
131
2
대표적인 TCP 장애 유현
0
160
2
이벤트 기반 파일 입출력과 callback 기반 파일 입출력이 네트워크에도 쓰이는 기법인가요?
0
120
2
개발환경 질문이 있습니다.
0
137
1
TCP/IP vs UDP , 멀티 스레드에서의 병목 현상에 대한 질문이 있습니다!
0
221
2
메모리 관련 문제로 질문드립니다.
0
187
2
테스트 환경 질문드립니다!
0
168
2
ThreadAcceptLoop 의 우아한(?) 종료에 대해 질문드립니다.
0
419
2
하트비트 시 서버에서의 연결 종료
0
451
2
강사님 질문 드립니다.
0
249
1
소켓 입/출력 설계 정리
0
450
1
멀티스레드 기반 서버 관련 질문..!
0
412
2
빅 엔디언과 리틀 엔디언
0
377
2
TIME_WAIT 관련 문의드립니다.
0
226
1
강사님 강의자료 인쇄용으로 부탁드립니다.
0
288
1
bind 함수 관련 궁금증
0
357
2





