c++ 문법에 대해서.. (변수 전달)
c++ 에는 낯설어서 잘 모르는 부분이 있습니다.
만약 다음의 세계의 파일이 잇다고 할때...
socket.h , socket.cpp, main.cpp
socket.h 에는 ======================================================
class SocketServer {
public
int sd;
public
SocketServer(int port) throw(Exception);
~SocketServer();
int start_new_session();
void nonblock();
void block();
};
socket.cpp 에는 다음과 같은 구문이 있다고 합시다. ==================
if ((sd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { //
do some error check !!
throw Exception("(SocketServer fail-to-open-socket)");
}
그럼 main.cpp 는 ===================================================
void sig_hangup(int signum)
{
cout << "Restarting...." << '\n';
close(sd); <---------- 이 소켓 디스크립터가 관점입니다.
execv(argv[0], argv);
cout << "Could not restart" << '\n';
abort();
}
이럴 경우 메인에서 HUP 신호에 따라 데몬을 재시동 시켜 줘야 되고
그럴 려면 close(sd); 를 실행해야 되는데, 다른 파일에 정의 되어
있은 sd 소켓 디스크립터를 어떻게 닫아줘야 되는지 모르겠네요..
이것 저것 고쳐 보니까, 'sd 가 정의가 되지 않았습니다'
이런 메시지만 나오고.. c 는 어느정도 하겠는데 cpp은 너무 어렵네요..
끝까지 읽어 주셔서 감사합니다.
이상입니다.
Re: c++ 문법에 대해서.. (변수 전달)
우선 main.cpp어딘가에 SocketServer 객체
를 생성한 것이 있을 것입니다.
예를 들면
SocketServer server 라든지
SocketServer *server = new SocketServer
라든지 등등
하여튼 그래서 그 객체의 이름을 알아서
위의 방식으로 정적으로 생성되었다면
close(server.sd)
하시면되겠구요
아래의 방식으로 동적으로생성되었다면
close(server->sd)
하시면되겠습니다.
원래 좀 더 cpp처럼 처리하려면
SocketServer에 아래와같은 close메소드를
추가한후
void SocketServerclose()
{
close(sd);
}
server.close()
를 호출하는 것이 낳겠지요.
그럼.
Re: c++ 문법에 대해서.. (변수 전달)
C 처럼 하시면 됩니다. ^^
C 로 짰다면 main.c, socket.h, socket.c 로 만드셨겠죠?
socket.c 에는 소켓 다루는 루틴들이 있겠고요.
소켓 변수는 어디에다 두실건가요?
socket.c 보다는 main.c 에 두시겠죠?
int server_socket;
식으로요..
그리고 시그널 핸들러 안에서는
close(server_socket);
이라고 하실 것이고요.
C++ 코드로 가 볼까요?
socket.cpp 에는 SocketServer 클래스의 메소드(멤버함수라 하나요? ㅡ.
ㅡ?)들이 들어있겠죠? socket.h 에는 클래스 선언들이 있겠고요.
SocketServer 클래스의 인스턴스는 어디에서 정의할까요?
아마 main.cpp 에서 하시겠죠?
main.cpp 어딘가에
SocketServer myServer(25);
같은 정의가 있겠죠?
그럼 시그널 핸들러 안에서는
myServer.shutDown();
처럼 불러주시면 되겠죠.
shutDown() 같은 것이 별도로 없고 디스트럭터에 들어가 있다면,
그냥 프로그램 종료되면 디스트럭터가 불리니까 죽어버리면 되겠네요.
그렇지 못한 상황이면 디스트럭터에서 해야 할 일을 protected 메소드
정도로 만드시고 디스트럭터도 그걸 부르고, 시그널 핸들러에서도
그걸 부르고 하면 되겠네요.
리눅스 님께서 짠 코드에는 SocketServer 클래스의 인스턴스가 없네요.
아마 이것 때문에 헷갈리셨을것 같은데요,
socket.cpp 에 나오는 sd 는 C로 생각하면
소켓 처리 함수의 파라메터 이름 정도로 생각하시면 됩니다.
int some_socket_routine(int sd_formal_param)
{
....
}
여기서 sd_formal_param 을 정의되어 있다고 하지는 않잖아요?
어딘가에 sd_actual_param 이 정의되어 있어서 some_socket_routine()의
파라메터로 전달되어야 하는 것이잖아요.
그것처럼 sd도 정의된 변수가 아니라, SocketServer socketServer;
처럼 socketServer 가 정의된 변수죠. (지금 코드상에는 안 나와 있는..)
댓글 달기