tcp통신에서 send,recv에관한 질문입니다.

itexpert의 이미지

안녕하세요
tcp서버와 다중클라이언트간의 통신을 할려고하는데요.
보통 tcp서버측에서는 client가 접속시 accept하고,
recv()를 실행할수있고,
또는 소켓기술자(select를 사용해서 구현했을경우 입니다)
각 client의 기술자를 통해 recv할수가 있는데.
그럼 클라이언트에서 send할수있는 기회는 두번.
서버측에서도 2번.
그런데 제가 하려는 작업의 특성상.
최소 5쌍의 send,recv 가 서버와 클라이언트사이에 일어나야하는데요
각쌍마다 다른정보를 전송해주도록 할거거든요.

예를 들어. client에서 A라는 정보를 send 하고, B라는 정보를 send,,,하면
서버에서는 각 recv문이 구별을 해서 받을수있도록 구현하고 싶거든요.
각 정보를 저장하는 변수또한 틀리니까.
A라는 정보를 send했는데 서버에서 B라는정보를 받는recv에서 A정보를
recv하면 안되니까요..
이러한 작업을 하고 싶은데..감이안오네요..어떤식으로 해야할지.
답변주시면 정말 감사하겠습니다.
수고하세요

alsong의 이미지

Quote:
client에서 A라는 정보를 send 하고, B라는 정보를 send

소켓을 2개 만들고 A정보는 1번소켓으로 B는 2번소켓으로 받으세요.
recv함수가 호출될시에 fd를 체크해서 정보를 구별하면 됩니다.

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

itexpert의 이미지

일단.접속되는 클라이언트마다
fd가 유일하게 생성되는데요.
그유일한 fd를 통해서 클라이언트와 통신이 가능하며,
거기에 성격이 다른 정보A,정보B를 보내야하는데.
그안에 소켓을 더 만든다는 의미인가요?
잘 이해가 안되서요.^^;;
답변주시면 감사하겠습니다.

짱이의 이미지

tcp통신은 신뢰성을 바탕으로하기 때문에 사용자헤더를 만들잖아요.
그사용자헤더 구조체안에 서비스코드등을 두어서 A정보인지 B정보인지 가려내서 처리하면 되지 않을까요?

질문의 의도가 이게 아니라면 다시 설명좀...^^

itexpert의 이미지

의도가 맞거든요. ^^ 연결된 소켓을 바탕으로 그 클라이언트의
아이디,암호 체크나 서버에서 접속되어잇는 클라이언트들의 정보들이나.등등
또한 여러정보를 주고 받아야하는데.
제가 아는 send/recv의 상황은 두번밖이라. 두번을 이용하여 처리하기엔
한계가 있어서요.
A정보도 구조체이고, B정보도 다른구조의 구조체이고. 성격자체가 틀리기
때문에요. 이럴때 어떻게들 처리해주는지 궁금해서요.
같은성격의 정보라면 그렇게 해도 될듯 싶은데요.전혀틀려서요
쉽게말해.
서버 ---클라이언트1
<--아이디,암호전송
-->접속자들의 정보전송
<-- 정보3..
<-- 등등.
클라이언트는 다수입니다.
이런경우 입니다. 이럴때 서버나 클라이언트에서 적절히 recv나 send해야
하거든요.

jinyeong의 이미지

TCP socket은 application에 byte stream을 제공합니다.
send 를 두번 했다고 해서, 받는 쪽에서 recv를 두번 해서 읽을 것이라는 보장은 없습니다.
MESG_TYPE field를 따로 두시는 방법이 좋을 것 같습니다.

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

itexpert의 이미지

MESG_TYPE field를 따로 두어 구현하는 방법이 어떻게될까요?

지금 보고있는 책에서는 못본것같아서요.

alsong의 이미지

Quote:
tcp통신은 신뢰성을 바탕으로하기 때문에 사용자헤더를 만들잖아요.
그사용자헤더 구조체안에 서비스코드등을 두어서 A정보인지 B정보인지 가려내서 처리하면 되지 않을까요?

단일 소켓이면 이 방법밖에 없습니다.
헤더 중에 일치된 헤더 하나를 만들어서 일치시켜야 됩니다. 부가적인 정보를 붙여서 처리하세요.

//공통 header
typedef struct msghd {
   int srvid;
   int size;
} msghd_t;

// service
struct service {
    msghd_t hd;
    char id[8];
    char password[8];
};


while(1) {
    recv();
    msghd = buf
    switch(msghd.svcid) {
    case LOING :
        process();
        break;
    ....
    default:
}

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

ssehoony의 이미지

위에 답이 있는 것 같은데 부연비스꾸리하게 하자면

인터넷 익스플로러를 예로 한번 들어보져

인터넷 익스플로러에 gif 던 jpeg 던 해당 파일이있는 곳의 위치를
입력하면 해당 이미지가 표시가 되자나요?

인터넷 익스플로러가 해당 파일을 내부 포맷을 파일확장자 명으로
구별하는 방식을 사용했다고 가정하면(실제 그렇지 않지만)
소켓통신을 위의 답글중 하나인 "복수개의 fd 값을 이용해서 구별한다"에
비유한다면

실제 IE는 gif 나 jpeg 를 확장자를 보는게 아니고 해당 파일의 헤더를 읽고
헤더에 있는 정보를 분석해서 구별합니다.
이걸 소켓 통신으로 보면 요청용 헤더패킷을 하나 만들고 그 패킷안에 요청별
구분 코드를 셋팅해서 요청하고 받는 측에서는 헤더패킷의 요청구별코드에
따라 분기해서 용청코드에 부합하는 응답을 해주는 방식이라고 할 수 있지
않을까 하네요.

itexpert의 이미지

Quote:
헤더 중에 일치된 헤더 하나를 만들어서 일치시켜야 됩니다. 부가적인 정보를 붙여서 처리하세요

답변감사드립니다.죄송한데..예좀 들어 설명좀 해주실수 있으세요?
간단한 구문이라두요. .. 헤더에대한 지식은 책에서 못봐서.
생소하네요.
짱이의 이미지

어짜피 앞에 헤더는 공통이니 긴 스트림중에서 헤더사이즈만큼만 헤더구조체로 케스팅한후에
헤더의 서비스코드를보고 A타입이면 A타입구조체로 캐스팅
B타입이면 B타입구조체로 캐스팅...
하면 됩니다.

그리고 헤더안에는 메시지사이즈를 넣으셔야죠...
그래서 recv할때 우선 헤더사이즈만큼 받았는지 확인후
헤더로 캐스팅한다음 메시지사이즈만큼 받았는지 꼭 확인하세요...
TCP에서 send와 recv의 어떠한 일치도 장담할수 없습니다.
그리고 구조체 변수중 숫자형은 htonl,ntohl 빼먹지 마시구요.. ^^

sunyzero의 이미지

님은 send/recv를 하나의 소켓에서 하면 서로 섞일수가 있다고 생각하시는것 같습니다. I/O multiplexing이나 소켓, 파일디스크립터를 다루는 부분을 좀더 공부하지 않으시고 더 접근하신다면 매번 문제가 생깁니다.

좀더 운영체제나 파일관련된 부분을 공부하신다면 위의 질문에 대한 답은 자연스레 해결됩니다. 이것들은 솔직히 책을 제대로 공부하시면 답이 다 나옵니다. ^^

========================================
* The truth will set you free.

댓글 달기

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