TCP/IP 소켓 프로그램 질문입니다.

jamongx의 이미지

소켓 하나로 메시지를 주고 받는 프로그램을 작성하고 있는데요

소켓은 한순간에 메시지나 파일을 주거나 / 받거나

한동작만 수행을 하는데..

어떻게 하면 들어오는 메시지를 다 받고

보낼 메시지를 다 전송할 수 있을까요?

예전에 짜본거는 그냥 편하게 작성하느라 보내는 소켓 하나 만들고

받는 소켓하나 만들어서 신경쓸일이 없었는데..

소켓을 하나만 만들어서 프로그램을 작성하려니 감이 잘 오지 않습니다.

mach의 이미지

tcp는 신뢰성 있는 프로토콜입니다.
신뢰성(reliability)은 tcp스펙을 구현한 운영체제 내부에서
보장하게되어 있습니다.
이를 사용자 레벨에서는 소켓을 써서 사용하게 되어 있습니다.
소켓은 양방향통신(Full Duplex)을 지원하며(하드웨어 관계없이), socket()시스템 호출의 결과로 나온 socket디스크립터로 In /OUT을 모두 관장하게 됩니다.
그래서, 소켓을 하나 만들어서, 이 소켓에 쓰면 가는것이고, 이 소켓에서 읽으면 오는겁니다.
쓰는중 오는것? 이건 위에서 말씀드렸듯이 운영체제가 (tcp/ip 프로토콜 스택)이 해줘야 하는 것입니다. 아니, 운영체제내의 TCP/IP프로토콜 스택이 해줍니다.
즉, 들어오는 메시지 다받고, 보낼메시지 다 전송해줍니다.

그러니, 그냥 쓰면 됩니다. 프로그램 스타일때문에
in, out 소켓을 정 구분하는게 좋다면,
int in, out, xx;
xx = socket(...);
in=xx;
out=xx;
이런식으로 하면 되겠지요.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

익명 사용자의 이미지

흠...그럼 제가 잘못알고 있었던것 같은데요

TCP 소켓을 만들면 동시에 메시지를 보내고 받을수 있다는 말씀이신가요?

엄청난 오해를 하고 있었구만요 ㅡㅡ;

mach의 이미지

Anonymous wrote:

..
TCP 소켓을 만들면 동시에 메시지를 보내고 받을수 있다는 말씀이신가요?
..

* 참고 : 동시[同時] 라는 말에는 다소 어감상 차이를 느낄 수 있습니다.
물리적 동시라고 하기 어려우며 논리적 동시라고 봐야겠습니다. 쉬운 예로,
mp3플레이어를 틀어놓고(음악을 들으면서), 워드작업을 한다는것을 동시로
볼 수 있다면, 동시에 메시지를 주고받을 수 있습니다.
해상도를 아주 높여서, CPU가 하나인데 어떻게 동시에 두개의 프로그램이 수행됩니까? 라는 의문으로 가면 묘~해지지요. 동시성을 이해해야 하니까요.
통상 전산학에서는 그정도 해상도를 생각하지는 않습니다.
물리적 장치(통신라인 및 네트워크 인터페이스장치등) 수준에서의 동시와는
차원이 다른 얘기 입니다. TCP는 이러한 물리수준이 아닌 논리수준이기 때문입니다. 논리수준이라고 해도 운영체제 내부의 장치드라이버(device driver)가
인터럽트, DMA, 및 각종 IO technology를 반영하고 있고, 그 상위에 신뢰성
구축등을 운영체제내의 프로토콜 스택에서 해주기때문에, 사용자 프로그램은
그 상위만을 생각하게 해줍니다. 하드웨어 몰라도 할 수 있다라는 것이지요.(물론,
알면 좋습니다!)
OSI 7 Layer 참조 모델로 봐도 물리계층에서 한참 올라가서 4번째 계층에
위치하니까 말입니다. 저수준의 물리(1), 링크(2), 라우팅(3)등을 고민하면서
통신 응용을 만들지 말라는게 각각의 상위계층의 의미이고 통신계층모델의 목적이기도 합니다.
통상적으로 OSI기준 4번째 계층인 transport layer까지는 운영체제 내부에
구현되는것이 보통입니다.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

익명 사용자의 이미지

[MSG_WAITALL] wait for full request or error

해당사이즈만큼 recv를 할때까지 기다립니다... 예외도 있겠지요..

man recv 로 확인해보시고요...

보통 소켓은 recv buff 와 send buff가 따로 구성됩니다..

커널 사이드에서 소켓 버퍼 관리및 TCP/IP 기본 업무를 수행하기때문에

app 레벨에서는 해당 소켓의 이벤트와 버퍼를 어떻게 처리하냐에

따라서 동시 처리가 가능합니다.. 아주 기본적인 예를들면..

recv 와 send를 각각의 쓰레드로 분리하는 일이지요..

나머지는 커널이 알아서..

네트워크 프로그래밍은 한마디로.. 설명이 불가합니다.

네트워크 상황에 따라서 OS상황에 따라서 많은 예외처리가 있습니다..

어느정도 이해하시고 감안해서 원하는 아웃풋의 네트워크 모듈을 만드시길

바랍니다..

익명 사용자의 이미지

감사합니다 ㅜㅜ (<-- 파도치는 감동의 눈물)

댓글 달기

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