네트워크 관련 통신입니다.
글쓴이: gugudan / 작성시간: 월, 2006/11/13 - 9:25오후
thread를 사용하지 않고 공유메모리와 세마포어를 사용해서 서버를 만들려고 하고 있습니다.
저의 생각에 일단 각각 사용자가 accept를 할때 리턴되는 sockfd의 값을
공유메모리에 가지고 있다가 execle로 뜬 프로세스에서
공유메모리 체크하여 sockfd값만큼 패킷을 돌리면 broad 캐스팅을 할 수 있을거 같았는데
만들었는데 전혀 되질 않네요.
제가 멀 잘못 알고 있는 부분이 있나요?
ex)
listen()
while()
{
accept_fd = accept();
공유메모리에 fd 기록..
childpid = fork();
if( childpid == 0 )
{
execle("aaa")
}
}
aaa라는 프로세스에서...
공유메모리체크하여 각각의 user에게 브로드캐스팅..
aaa프로세스에서 공유메모리 값을 출력했을때 소켓 fd까지는 정상적으로 가져왔습니다.
혹시 제가 잘못 알고 있는 부분이 있는지요?
그럼 수고하세요.
Forums:
..
공유메모리에서 읽은 값은 소켓 디스크립터가 아니라, 그냥 단순한 정수형 값일 뿐 입니다.
child 프로세스에서 parent 프로세스에서 받아들인 소켓 디스크립터를 사용하려면 변수 그대로 accept_fd를 사용해야 합니다.
굳이, 공유메모리를 이용하려고 하신다면 소켓 디스크립터를 배열로 관리하시고, 공유메모리로는 소켓 디스크립터 배열의 인덱스 정보를 전달하도록 하셔야 합니다.
--
종이한장 * 이성으로 비관하더라도 의지로 낙관하라! (그람시)
--
종이한장 * 이성으로 비관하더라도 의지로 낙관하라! (그람시)
네..감사합니다.. 한가지 좀 궁금한게..
공유메모리를 이용하려고 하신다면 소켓 디스크립터를 배열로 관리하시고, 공유메모리로는 소켓 디스크립터 배열의 인덱스 정보를 전달하도록 하셔야 합니다.
이렇게 말을 하셨는데..
accept에서 받은 소켓 디스크립터를..
userfd[1000];
이렇게 userfd 배열에 하나씩 하나씩 관리를 하게끔 했습니다.
그리고 이 userfd를
memcpy를 이용해서 공유메모리에 copy했습니다.
저 위에 말씀하신게 지금 위와 같이 제가 한 방법을 말하나요?
이렇게 해도 자식 process에서 공유메모리 값을 읽은건 역시 그냥 단순한 정수값인거 같은데..
지금 구조가..
fork를 해서 자식 프로세스에서 다시 새로운 process를 호출(execle)하는데
이 새로운 process에서 fd값을 참조를 할려고 하는건데
sendmsg나 recvmsg를 이용해서 소켓 fd를 전송해야 한다고 하는데
이 방법 말고는 없는건지요?
..
제가 질문내용을 제대로 이해하지 못했네요.
execl을 호출하셔서 공유하려고 하시면, 알고계시는 방법을 사용하셔야 합니다.
UNIX Network Programming 을 보시면 Socket descriptor Passing 이던가?
에 설명되어 있을 것입니다.
다만, 사용하시는 OS종류나 커널 종류에 따라 지원되지 않을 수도 있습니다.
--
종이한장 * 이성으로 비관하더라도 의지로 낙관하라! (그람시)
--
종이한장 * 이성으로 비관하더라도 의지로 낙관하라! (그람시)
생성한 프로세스에
생성한 프로세스에 전달한 디스크립터는 단순히 정수값일 뿐이지 디스크립터를 전달하는게 아닙니다. 디스크립터 자체를 전달하려면 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
댓글 달기