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은 너무 어렵네요..

끝까지 읽어 주셔서 감사합니다.
이상입니다.

익명 사용자의 이미지

우선 main.cpp어딘가에 SocketServer 객체
를 생성한 것이 있을 것입니다.
예를 들면
SocketServer server 라든지
SocketServer *server = new SocketServer
라든지 등등
하여튼 그래서 그 객체의 이름을 알아서
위의 방식으로 정적으로 생성되었다면
close(server.sd)
하시면되겠구요
아래의 방식으로 동적으로생성되었다면
close(server->sd)
하시면되겠습니다.
원래 좀 더 cpp처럼 처리하려면
SocketServer에 아래와같은 close메소드를
추가한후
void SocketServerclose()
{
close(sd);
}

server.close()
를 호출하는 것이 낳겠지요.
그럼.

익명 사용자의 이미지


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 가 정의된 변수죠. (지금 코드상에는 안 나와 있는..)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.