[완료]tcp/ip 소켓프로그래밍 전송 질문입니다.

anaud2의 이미지

현재 TCP/IP로 소켓프로그래밍을 공부하고 있습니다.

현재 에코 서버/클라이언트를 하는데요

미션이 전문규격에 맞게 전송을 해야되는데

전문이 int 4byte
char[] 32byte
char[] 17byte
char 1byte
int 4byte
char[] 48byte
int 4byte
int 4byte
int 4byte
int 4byte

이렇게 총 122byte전문을 보내야합니다.
전부다 char[]로 형변환해서 안되고 그냥 바이너리로 보내라고 하는데

개인적으로 이해가 안됩니다.
write 함수는
ssize_t write(int filedes, const void * buf, size_t nbytes)
이렇게 정의 되어 있는걸로봐서 전송하는 buf타입은 상관이 없다지만
전문은 일정한 규격에 맞게 한번에 전송이 되어야하는걸로 알고 있습니다. 저것들을 바이너리값으로 변경해서 buf[]에 넣고 한번에 전송을 해야하나요?
그렇다면 int값같은것을 바이너리 값으로 어케 카피를 하나요?
memcpy(char buf[], (char*) int, sizeof(int))
이런식으로 int형을 char*로 강제 형변환하고 buf에 넣으려니까 세그먼테이션 페일이 생기더라구요 ㅠ

어떻게 해야 깔끔하게 전문을 바이너리로 해서 넣을수 있을까요?

brucewang의 이미지

제가 혹시 글을 잘못 이해 한 것이 아닐까 걱정스러운데 혹시..
글 남기신
memcpy(char buf[], (char*) int, sizeof(int));

int a=0;
char buf[4];
memcpy(buf, (char*)&a, sizeof(int));

의 예를 드신 거죠? 그렇다면 별 문제가 없어보이는데..

이미 아시는 내용일지 모르지만 혹시 도움이 될까 싶어서 적어 보겠습니다.

예를들어 100byte 사이즈가 한 메시지의 결정된 사이즈라면, write 등으로 그냥 그 100 사이즈 만큼을 보내시면 됩니다. 사이즈가 더 커서 하나의 TCP packet에 들어갈 수 없을 정도가 되더라도 결국에는 분할되서 상대편에 재 조합 됩니다. 물론 무제한으로 보낼 수는 없는것이지만요.

보내는쪽에 100바이트를 보내는데 받는쪽에서는 1바이트씩 받는다면, 100바이트 데이터가 도착하면 그 받는 함수를 100번 호출하고 나면 더이상의 데이터는 read 가 실패합니다. 뭐 이런식으로도 받을 수 있고요... (너무 두리뭉실하게 설명하는게 아닌가 모르겠습니다.)

자, 그럼 int 데이터를 그대로 보낸다고 보면 무엇을 생각하셔야 하면 byte ordering과 type size를 확인해 보셔야 하는데, 같은 CPU를 사용하는 같은 32bit 혹은 64bit운영체제끼리의 통신이라면 고려하지 않으셔도 되겠습니다.

네트워크 프로그래밍을 조금 오래하실 계획이 있으시다면 socket programming 책 이외에도 TCP/IP 자체에 대한 책을 보시는것이 좋을 것이라고 권해드리고 싶습니다.

그럼 성공하시길 빕니다~

-------------------------------------------------
$yes 4 8 15 16 23 42

-------------------------------------------------
$yes 4 8 15 16 23 42

zienie의 이미지

그냥 structure 로 구성한 다음에
총 122byte 이므로 structure byte padding을 고려해서 뒤에 2byte 붙여준 다음에

struct my_packet p;
...
...
...
write(sock_fd, &p, sizeof(p));

로 쏘는게 제일 간단해 보입니다.

##########################################################
넘어지는건 아직 괜찮다.
하지만 넘어질때마다 무언가를 주워서 일어나자.

##########################################################
넘어지는건 아직 괜찮다.
하지만 넘어질때마다 무언가를 주워서 일어나자.

bushi의 이미지

compiler 의존적이고 endian 의존적인 코드와 그 결과.

[bushi@rose net]$ gcc -s -o nc netcp.c -Wall
[bushi@rose net]$ ./nc
member:  d1, offset:   0, size:  4
member:  d2, offset:   4, size: 32
member:  d3, offset:  36, size: 17
member:  d4, offset:  53, size:  1
member:  d5, offset:  54, size:  4
member:  d6, offset:  58, size: 48
member:  d7, offset: 106, size:  4
member:  d8, offset: 110, size:  4
member:  d9, offset: 114, size:  4
member: d10, offset: 118, size:  4
[bushi@rose net]$

compiler 에 비의존적이고 endian 에 비의존적인 코드를 만드려면...
수작업으로 버퍼의 크기와 offset 을 계산하는 수 밖에.

OTL

댓글 첨부 파일: 
첨부파일 크기
Plain text icon netcp.c.txt1.25 KB

댓글 달기

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