네트워크 관련 통신입니다.

gugudan의 이미지

thread를 사용하지 않고 공유메모리와 세마포어를 사용해서 서버를 만들려고 하고 있습니다.
저의 생각에 일단 각각 사용자가 accept를 할때 리턴되는 sockfd의 값을
공유메모리에 가지고 있다가 execle로 뜬 프로세스에서
공유메모리 체크하여 sockfd값만큼 패킷을 돌리면 broad 캐스팅을 할 수 있을거 같았는데
만들었는데 전혀 되질 않네요.

제가 멀 잘못 알고 있는 부분이 있나요?

ex)

listen()
while()
{
accept_fd = accept();
공유메모리에 fd 기록..
childpid = fork();
if( childpid == 0 )
{
execle("aaa")
}

}

aaa라는 프로세스에서...

공유메모리체크하여 각각의 user에게 브로드캐스팅..

aaa프로세스에서 공유메모리 값을 출력했을때 소켓 fd까지는 정상적으로 가져왔습니다.
혹시 제가 잘못 알고 있는 부분이 있는지요?

그럼 수고하세요.

jongi의 이미지

공유메모리에서 읽은 값은 소켓 디스크립터가 아니라, 그냥 단순한 정수형 값일 뿐 입니다.
child 프로세스에서 parent 프로세스에서 받아들인 소켓 디스크립터를 사용하려면 변수 그대로 accept_fd를 사용해야 합니다.
굳이, 공유메모리를 이용하려고 하신다면 소켓 디스크립터를 배열로 관리하시고, 공유메모리로는 소켓 디스크립터 배열의 인덱스 정보를 전달하도록 하셔야 합니다.

--
종이한장 * 이성으로 비관하더라도 의지로 낙관하라! (그람시)

--
종이한장 * 이성으로 비관하더라도 의지로 낙관하라! (그람시)

gugudan의 이미지

공유메모리를 이용하려고 하신다면 소켓 디스크립터를 배열로 관리하시고, 공유메모리로는 소켓 디스크립터 배열의 인덱스 정보를 전달하도록 하셔야 합니다.

이렇게 말을 하셨는데..
accept에서 받은 소켓 디스크립터를..
userfd[1000];
이렇게 userfd 배열에 하나씩 하나씩 관리를 하게끔 했습니다.
그리고 이 userfd를
memcpy를 이용해서 공유메모리에 copy했습니다.

저 위에 말씀하신게 지금 위와 같이 제가 한 방법을 말하나요?

이렇게 해도 자식 process에서 공유메모리 값을 읽은건 역시 그냥 단순한 정수값인거 같은데..

지금 구조가..
fork를 해서 자식 프로세스에서 다시 새로운 process를 호출(execle)하는데
이 새로운 process에서 fd값을 참조를 할려고 하는건데
sendmsg나 recvmsg를 이용해서 소켓 fd를 전송해야 한다고 하는데
이 방법 말고는 없는건지요?

jongi의 이미지

제가 질문내용을 제대로 이해하지 못했네요.
execl을 호출하셔서 공유하려고 하시면, 알고계시는 방법을 사용하셔야 합니다.
UNIX Network Programming 을 보시면 Socket descriptor Passing 이던가?
에 설명되어 있을 것입니다.
다만, 사용하시는 OS종류나 커널 종류에 따라 지원되지 않을 수도 있습니다.

--
종이한장 * 이성으로 비관하더라도 의지로 낙관하라! (그람시)

--
종이한장 * 이성으로 비관하더라도 의지로 낙관하라! (그람시)

superkkt의 이미지

생성한 프로세스에 전달한 디스크립터는 단순히 정수값일 뿐이지 디스크립터를 전달하는게 아닙니다. 디스크립터 자체를 전달하려면 jongi님이 말씀하신것처럼 unp 참조하시구요..

간단히 왜 안되는지 보자면.. 일단 std in/out/err가 0/1/2 번 디스크립터를 쓰는 상황에서 A, B 두개의 프로세스가 소켓을 하나씩 열면 각각 3번 디스크립터를 할당할겁니다. 이렇게 프로세스는 각자 자기만의 독립된(?) 디스크립터를 사용합니다.

이 경우에 A 프로세스가 3이라는 숫자값을 B 프로세스에게 전달했다고해서 B가 A의 3번 디스크립터를 사용할 수 있는건 아니죠. B는 3이라는 숫자를 사용해서 자기가 열고 있는 디스크립터 중에 3번 디스크립터를 사용하려고 할겁니다.

자식프로세스는 부모의 디스크립터 정보를 상속받기 때문에 그대로 사용이 가능한것이고요.

======================
BLOG : http://superkkt.com

======================
BLOG : http://superkkt.com

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.