소켓 프로그램에서 힌트좀 얻고싶습니다.

tazanboy의 이미지

다음과 같은 프로그램을 만들려고 합니다.

소켓 프로그램을 실행시켜서 클라이언트로부터 명령을 입력받고,
출력결과를 클라이언트로 돌려줍니다. 이때, 명령을 입력받으면 해석해서
해석한 명령과 일치하는 데이터를 시리얼로 보내어서 시리얼로부터
응답 데이터를 받습니다. 그리고 이 데이터를 클라이언트로 보냅니다.

시리얼에 부착된 장비는 반이중 통신 방식입니다. 그리고, 초기화 과정이
필요합니다. 초기화 과정이 끝나면 특정 시간동안 아무런 명령이나
통신이 없으면 스스로 통신을 종료합니다. 따라서, 주기적으로 죽지않게끔
신호를 보내줘야만 합니다.

소켓 프로그램은 시리얼 장치 제어를 위한 간단한 디바이스 드라이버에
관한 파일 디스크립터와 시리얼에 관한 디스크립터, 그리고 소켓 디스크립터
이렇게 세개의 디스크립터를 기본적으로 열게 됩니다.

클라이언트로부터 접속을 받으면 또다른 소켓 디스크립터를 열어서
통신을 하게 됩니다.

전반적인 프로그램 개요는 이렇게 생각하고 있습니다.

제가 궁금한것은

1.
select를 사용해서 타임아웃을 주어서 타임아웃이 몇번 반복되면
주기적으로 신호를 보낼 수 있을것이라 생각합니다. 이것이
가능한지 힌트를 좀 부탁합니다. 또한, 가능하다면 select 함수에 필요한
인자중 파일 디스크립터는 어떻게 줘야 하는지도 궁금합니다.

2.
시리얼은 반이중이고 한번 명령을 주면 그에 맞는 응답을 줍니다.
그런데, 계속적으로 응답이 필요할때가 있습니다. 따라서 서버에서 계속해서

시리얼로 명령을 보내고, 받고 클라이언트로 보내주고.
시리얼로 명령을 보내고, 받고 클라이언트로 보내주고..

이런 루틴을 돌고 있을때가 있습니다. 이렇게 한 작업을 계속 하고
있을때 소켓 프로그램에 어떻게 명령을 줄 수 있을지 모르겠습니다.

가르침을 부탁드립니다.

liongo의 이미지

질문 자체가 소켓 통신 기본적인것 같습니다..

1번과 2번 비슷한 문제인것 같습니다...

1번질문은 select 타이마웃 을 설정하시면 됩니다..

서버경우 보통. 셀렉트문에서 걸리는 타임아웃과 바쁜일을 하는도중

보내는건 어떻게 할거냐하는 문제는 기본 고민거리지요..

기본적으론 두가지 타입이 있습니다.

1.번 소켓을 논블러킹으로 세팅한다..

2.번 쓰레드로 구분하여 보내고 받는놈을 돌린다..

쓰레드라면 한놈은 보낸는일 한놈은 받는일을 하니 쉽게 해결되겠지요..

논블러킹일경우에는 보내는게 일정치 않습니다 현재 시스템 상황에따라

보내지는 양이 틀리기 때문에 스트림버퍼를 구현해서 보내지는 만큼 전송하는

식으로 하면 됩니다.. 데이타가 안깨지게.. 처리하는 부분을 말하는거죵..

소켓 기본사항에 대한 글은 마니 올라와있습니다.. 제글이 넘 짧아서 이해가

안되신다면.. 소켓관련 정보를 찾으시면 쉽게 구하실수있습니다.

' 형식이 내용을 규정한다. '

tazanboy의 이미지

프로그래밍 지식이 없어서 지금 마구잡이로 보고는 있는데,
어렵네요. 감도 잘 안오고요. ^^
열심히 하는수밖에는 ^^
답변 감사드립니다. ^^

tazanboy의 이미지

주기적으로 신호를 주는 것은 while 문안에다가 sleep을 집어넣어서
보내면 될것 같다는 생각이 듭니다.
그리고 client로부터 오는 신호는 시그널(SIGIO)을 사용해서 받으면
될것 같고요. 그런데 while문안에서 주기적으로 신호를 주고 다시 받아서
제대로 받았는지 확인한다음 sleep(2)정도 주어서 사용하려고 하는데요.

while문안에서 신호를 준다음 받기 직전에 시그널이 걸리면
이전의 상태는 모조리 저장되고 시그널 처리한다음 다시 돌아오잖아요?
시그널이 처리된다음에 돌아왔을때는 시그널 발생전에 보내고 받는루틴중
받는 루틴쪽에서 데이터가 나오지 않아서 에러가 날것 같은데..

이 부분에 대해서 역시 구현을 해주어야 겠지요? 가령 보내고 받을때
일정시간이 지나면 리턴하라는 식으로요?

답글좀 부탁드리겠습니다. 지금 짜기 시작하긴 할건데, 제대로 파악하지
못하고 짜다가 나중에 안된다는것을 알면 낭패일것 같아서요.

liongo wrote:
질문 자체가 소켓 통신 기본적인것 같습니다..

1번과 2번 비슷한 문제인것 같습니다...

1번질문은 select 타이마웃 을 설정하시면 됩니다..

서버경우 보통. 셀렉트문에서 걸리는 타임아웃과 바쁜일을 하는도중

보내는건 어떻게 할거냐하는 문제는 기본 고민거리지요..

기본적으론 두가지 타입이 있습니다.

1.번 소켓을 논블러킹으로 세팅한다..

2.번 쓰레드로 구분하여 보내고 받는놈을 돌린다..

쓰레드라면 한놈은 보낸는일 한놈은 받는일을 하니 쉽게 해결되겠지요..

논블러킹일경우에는 보내는게 일정치 않습니다 현재 시스템 상황에따라

보내지는 양이 틀리기 때문에 스트림버퍼를 구현해서 보내지는 만큼 전송하는

식으로 하면 됩니다.. 데이타가 안깨지게.. 처리하는 부분을 말하는거죵..

소켓 기본사항에 대한 글은 마니 올라와있습니다.. 제글이 넘 짧아서 이해가

안되신다면.. 소켓관련 정보를 찾으시면 쉽게 구하실수있습니다.

bugiii의 이미지

시리얼 연결 장치: D, 클라이언트: C

D: 1, C: 1
D: 1, C: n
D: m, C: n

경우마다 다르게 구현될 수 있다고 봅니다. 현재 상황과 앞으로의 상황을 예측해주세요.

댓글 달기

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