가위바위보 게임 Client VS Client

불량도ㅐㅈㅣ의 이미지

클라이언트끼리 가위바위보 해서 서버가 결과를 알려주는 프로그램을 짜야 합니다.

fork,pipe를 이용해서요.

그런데 어떻게 해야 될지 생각이 잘 안나네요.

그림을 보면

각각 클라이언트가 접속하면 fork로 자식 프로세스를 만듭니다.

1: 클라이언트에서 보낸 가위바위보 값중 하나를 자식프로세스는 받습니다.

2: 자식은 그 값을 고대로 부모한테 전달

3: 부모는 각각 자식한테 받은 값으로 계산하여 승패를 각각 자식한테 알려줍니다.(한명은 승,한명은 패 아니면 둘다 무승부)

4: 그 승패 결과값을 받은 자식프로세는 접속한 클라이언트한테 전달합니다.

이게 제가 짜야할 프로그램입니다.

저기서 의문인 것은

1.부모가 어떻게 자식들로 받은 값을 구분할 수 있을까요?

2.구분할려문 pipe 선언은 4개로 해야하는지?

3.승패를 각각 자식한테 어떻게 다르게 전달할 수 있을까요?

생각보다 쉬운 줄 알았는데...머리가 복잡해지네요..ㅡ.ㅡ

File attachments: 
첨부파일 크기
Image icon 12.gif56.48 KB
dreampia의 이미지

Quote:

1.부모가 어떻게 자식들로 받은 값을 구분할 수 있을까요?
2.구분할려문 pipe 선언은 4개로 해야하는지?

딱 2개의 client만 존재한다는 가정이면, named pipe 2개면 되겠죠.
처음 main process가 2개의 pipe를 O_RDWR로 열어서 int pipefd[2]; 에
fork()시에 각각 client의 pid를 int childpid[2]; 에 넣어서
pipefd[0]을 chlildpid[0]에, [1]을 [1]에 matching시키면 되죠.

named pipe는 open()을 통해서 열게되고
이 경우 file descripter를 return하기에 select()로 2개를 동시에 감시해서
pipefd[0]에서 data가 오면 childpid[0]에서 보낸거라고 할수 있겠구요.

Quote:

3.승패를 각각 자식한테 어떻게 다르게 전달할 수 있을까요?

2개의 pipefd[]에서 data가 올경우 이를 비교한 후에
각각의 pipefd[]에 write하면 끝이죠.
fork()된 child는 pipe에 write()한 후에 read()에서 blocking 상태로 대기.
값이 오면 결과를 client에게 전달하면 되죠..

내의도가 잘 설명된 걸까? ^^;

직접 작성한다면 위와 같은 문제는 fork(), threads, IPC를 생성할 필요없이
select()로 하나의 process에서 처리하는게 편하지 않을까 생각이 드네요.

>/dev/null 2>&1

불량도ㅐㅈㅣ의 이미지

dreampia wrote:
직접 작성한다면 위와 같은 문제는 fork(), threads, IPC를 생성할 필요없이
select()로 하나의 process에서 처리하는게 편하지 않을까 생각이 드네요.

오직 fork,pipe로만 구현해야 되서요..^^

아무튼 감사합니다..이거 오늘까지 끝낼수 있을라나?? ㅡ.ㅡ

문근영 너무 귀여워~~

divetou의 이미지

저희학교 분이신것 같네요.

같은 수업도 들으시는것 같네요. ^^;;

먼저 제 짧은 소견으로는..

1. 같은 파이프를 이용해서 통신을 할때
부모가 자식을 구분할 수 있는 방법..
구분할 수 있는 대표적인 방법이 pid로 구분을 하면 되죠

2. pipe를 여러개 만들면, pid로 구분하지 않아도 각각의 클라이언트를 구분할 수 있을 것 같습니다.

3. 역시 1번과 같이 클라이언트 프로세스에서 부모로부터 넘어오는 데이터에서 pid같은 것으로 구분해야 합니다.(부모에서 자식의 pid를 가지고 구분한다고 생각하면)

같은 수업듣는 분 같은데..

열심히 하세요~! ^^;

==============================
꿈꾸는소년

bass1ife의 이미지

Quote:

저희학교 분이신것 같네요.

같은 수업도 들으시는것 같네요. ^^;;


허허.....^^;;;;;;;
저도 같은 숙제를 하고 있답니다...ㅋ

젠투, 젠투, 그리고 젠투.

익명 사용자의 이미지

파이프를 하나만 만들려고 생각하셔서 구분 할 수 없다고 생각하신걸까요?

소켓 프로그래밍을 경험하지 못해서 쉽게 생각을 하지 못하신것 같은데
파일이던 소켓이나 파이프던 모두 fd 값을 가지고 구별 할 수가 있습니다.

그래서 일단 부모가 파이프 A를 만들어서 fork 하면 부모하고 자식하고 A 파이프로 연결이 되겠죠?
그리고 다시 부모가 B파이프를 생성해서 fork 를 하면 새로생긴 자식하고 부모가 B 파이프로 연결이 되겠죠.
물론 두번째로 생긴 자식은 A파이프와 B파이프 모두를 갖고 있을텐데 두번째로 생긴 파이프는 B만 사용하던지, 아님 처음 fork 한후에 자식쪽에서 A 부분은 닫아 버리면 되겠죠.

뭐 이렇게 되려나...

1. 부모
- pipe 생성
2. 부모 (pipe:A)
- fork
3. 부모 (pipe:A) <-----------> (pipe:A) 자식 1
- 부모 pipe 생성
4. (pipe:B) 부모 (pipe:A) <---------> (pipe:A) 자식1
- 부모 fork
5. 자식2(pipe:AB) <-----> (pipe:AB) 부모 (pipe:A) <-----> (pipe:A) 자식1
- 자식2 pipe B 닫음
6. 자식2(pipe:B) <-----> (pipe:B) 부모 (pipe:A) <-----> (pipe:A) 자식1

댓글 달기

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