죄송합니다. 질문의 요지를 잘못전달한것 같아서요.

itexpert의 이미지

아래 많은 리플들 주셔서 감사드립니다.
받은정보의 타입에 따라 각 서비스를 구현하는 질문이 아니었는데.
제가 글을 잘못올렸나봅니다. 죄송합니다.
제가 구현하고싶은것은..
예를들어
서버...................클라이언트1
recv(1)문............send(1)
recv(2)문............send(2)
recv(3)문............send(3)

이렇게 문장들이 각각 세개씩 있다고 했을때요
같은 send()에서 값을 1이나 2,3으로 보내는것이 아니구요

이렇게 구현한다고 치면,,
send(1)을 보냈을때..
서버측에서 recv(1)문장에서 받아야하는데.
recv(2)문장이나 recv(3)문장에서 받을 수도 있자나요.
그것을 방지하여 꼭 recv(1)에서 받고,,,
또한 send(2)로 보냈을땐..recv(2)문장에서 받구요
이것을 구현하고 싶거든요.
이것은 불가능한가요? send나 recv문장은 하나밖에 쓸수 없는건가요?
쓸수없다면,,아래의 답변을 이용해서 구현할수밖에 없는거겠지요?
도움을 주시면 정말 감사하겠습니다.

짱이의 이미지

뭔가 착각하시는것 같은데요...
전글에서도 send,recv할수 있는 기회가 두번뿐이라는게 무엇을 말씀하시는건지?

그리고 TCP는 스트림전송이에요...send함수를 세번호출했다고해서 세번이 따로 전송되는게 아닙니다.
send함수 호출후 리턴되는 값은 send큐에 몇바이트를 추가했다는거에요.
몇바이트씩 옮겨질지는 알 수 없구요...
그러니 send와 recv는 서로 일치한다고 생각하면 안됩니다.

이런얘기도 아니시라면 다시한번 설명을 해주세요.

alsong의 이미지

현재 구조가 하나의 fd에 3개의 recv가 걸려 있다는 이야기인지...
select를 사용하였다고 하는데 thread로 뛰우셨나요...

좀더 생각을 정리해서 올려주세요......

1,2,3이 fd가 아니고 일반데이터 종류라고 하면 방법이 없습니다.
포기하세요 ^^;

서비스 해더를 포함하거나 포트를 나누거나 fd를 여러게 나누거나....

꼭 나눠져야 하고 다른 프로토콜을 사용할수 있으면 다른 프로토콜을 사용하세요.(예,SCTP)

그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.

itexpert의 이미지

두번이라는기회는 처음 클라이언트가 서버에 접속했을때..send나 recv할수있는 첫번째 기회구요.
두번째는 클라이언트별로 기술자에 변경발생시
(select로 알수있을때) 처리할수있는 send나recv
기회 두번째입니다.
두번째 에서 서로다른타입의 정보를 전송하고
싶었는데.따라서 다른타입만큼 send문을 여러번
쓰고 recv문을 여러번 쓴다면,
recv입장에서는 해당변수에 맞는 send값들을 넣어야
하는데 recv문장을 여러번 작성한다면,
어떤 recv문장에서 받아 처리할지 모르니..
어찌보면, 잘못된 생각이 아닐까 합니다.
결국 하나의 send나 recv문밖에 작성할수 없는경우라면,,한방에
전송하고 하는 정보를 다 넣어 ..이렇게되면..구조체가 길어지고, 서비스타입필드까지 넣어서
서비스타입필드에 맞추어 처리를 해야할듯 싶습니다.

짱이의 이미지

TCP모델에 대해서 착각하시는것 같네요.
서버에 클라이언트가 1,2,3붙었다고 하면요...
각각 다른 fd로 서버와 스트림으로 연결되어있습니다.
그러니 다른클라이언트의 내용이 섞일 염려는 없구요.

send(1000byte) send(2000) send(500) 이런식으로 보내면 따로 가는게 아니라 세개가 덩어리로 말그대로 스트림으로 연결되어 있습니다.
그러니 recv에서는 몇번의 버퍼링으로 3500바이트를 받을지 모른다는 얘기죠...
실제로 recv에선 500..1000..1000..1000 이런식으로 받을수도 있다는거죠.
그래서 헤더에 메시지사이즈를 적어주는거에요. 메시지사이즈만큼 계속 recv를 호출하도록요.
TCP는 순서보장은 되기때문에 recv한만큼 포인터를 이동해서 계속 받으면 됩니다.

send/recv를 두번의기회에 한다는 생각은 좀 엉뚱한 생각같네요.

select는 각각의 클라이언트가 입출력준비가 될때까지 블록시키는겁니다.
계속 고민하는것보다 간단한 멀티플렉싱 프로그램을 짜보시면 오해가 사라질듯 싶네요.

kall의 이미지

send(1)로 보내면 recv(1)만 받을 수 있습니다.

int recv(int s, void *buf, size_t len, int flags);

recv에 들어가는 첫번째 인자가 1이면 1번만 읽어오고
1번으로 읽을 데이터가 없으면 그대로 블럭돼서 데이터가 들어올때 까지 멈춥니다.

recv(1)을 호출하면 send(2)나 send(3)이 들어온다고해서 그걸 읽는게 아니라
send(1)에서 보낸 데이터가 올때까지 무작정 기다립니다.

----
자신을 이길 수 있는자는
무슨짓이든 할수있다..
즉..무서운 넘이란 말이지 ^-_-^
나? 아직 멀었지 ㅠㅠ

itexpert의 이미지

넵 ^________^
주옥같은 답변들 감사합니다.
덕분에 완벽히 이해했습니다.
답변들 주셔서 정말 감사드리구여.
이해한 내용을 바탕으로 코딩에 들어가야겠습니다.
좋은하루 되세요.

Seven..의 이미지

해당 질문과 직접적으로 연관이 있는것은 아니나..
궁금한점이 있어서 이렇게 답을 답니다. :lol:

요즘 서버 모델을 공부하고 있어서 그런데요..
tcp서버는
보내는 횟수와 받는 횟수는 전혀 상관이 없다는 뜻이 될 수도 있겠네요?

Quote:
그래서 헤더에 메시지사이즈를 적어주는거에요. 메시지사이즈만큼 계속 recv를 호출하도록요.
TCP는 순서보장은 되기때문에 recv한만큼 포인터를 이동해서 계속 받으면 됩니다

그렇다면, 헤더에 메시지 사이즈를 적어준다는 뜻은.
적어도 헤더정도는 한번에 전송되는 양으로 보고 적어준다는건가요..?
물론 구조체 첫 4바이트정도가 되겠지만..
그런 신뢰 뒤에 있는 내용인지..
그렇다면 적어도 이정도까지는 한번에 보내진다..는
사이즈는 어느정도인지요?

VENI VIDI VICI

alsong의 이미지

보내는 횟수랑 받는 횟수는 전혀 상관없습니다.
한번에 보내는 크기랑 한번에 받는 크기도 전혀 상관없습니다.
받는 입장에서는 보낸쪽에서 순간순간 보낸 양과 횟수를 전혀 모릅니다.

헤더정도라도 한번에 전송된다고 보장할수 없습니다.
recv시에 총 받은 데이터가 4바이트 이상인지 체크해야 합니다.

그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.

jinyeong의 이미지

Quote:
그렇다면, 헤더에 메시지 사이즈를 적어준다는 뜻은.
적어도 헤더정도는 한번에 전송되는 양으로 보고 적어준다는건가요..?
물론 구조체 첫 4바이트정도가 되겠지만..
그런 신뢰 뒤에 있는 내용인지..
그렇다면 적어도 이정도까지는 한번에 보내진다..는
사이즈는 어느정도인지요?

한번에 보내진다는 것을 가정하는 것이 아니라,
header 부분의 size 부분을 보고, 그 size 만큼을 message로 받아 들이는 것입니다.

적어도 이 정도까지는 한번에 보내기를 원하신다면, 한번에 MSS size 만큼씩 보내시면 됩니다.
그렇게 된다면 하나의 TCP segment로 가게 되겠지요.
(원하신다면 Nagle을 끄십시오. single byte도 하나의 packet으로 전송될 것입니다.
단, 꼭 필요한 경우라면 말입니다.)
물론 그렇다고 해도 받는 쪽에서 이를 recv 한번에 받는다는 법은 없습니다.

header를 두시지 않고, send와 recv를 맞추시고 싶다면
TCP Out-of-Band 를 사용하면 비슷하게 만드실 수는 있을 것입니다.

관심이 있으시다면, TCP_CORK, TCP_NOPUSH 등도 살펴보시길 바랍니다.

I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?

댓글 달기

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