TCP 통신에서 무조건 byte단위로 송수신을 해야 하나요?

익명 사용자의 이미지

TCP/IP 소켓 프로그래밍 입문자 입니다.

TCP의 특징 중 하나인 "경계가 없어 read, write에 의존하는 코드를 작성하면 절대 안된다." 라고 알고있는데요.

그런데 소켓 프로그래밍 책에서 대략 다음과 비슷한 코드가 있는데

// Server
char cnt;
read(fd, &cnt, 1);
for(int i = 0; i < cnt; ++i) 
{
    read(client_fd, &temp, 1);
}
 
// Client
char buf[4] = { 3, 1, 2, 3 };
write(fd, buf, 4);

이러한 코드가 있는데
혹시 위 서버의 cnt변수의 자료형이 char이라서 잘 작동 하는 코드 인가요?

다시 말해서

// Server
int cnt;
read(fd, &cnt, 4);
 
// Client 
int value = 0x12345678;
write(fd, &value, 4);

위 코드는 위험한 코드 일까요?
물론 5번 이상의 테스트에서 모두 잘 작동하지만

TCP 통신의 특징인 경계가 없으니
혹시나 클라이언트에서 value 변수의 상위 2바이트인 1234 까지만 전송 되었고 (운영체제의 상황 때문에)
그 뒤 나머지 하위 2바이트인 5678는 전송 버퍼에 들어 간 상황에서 늦게 전송 되었다고 치고

이러한 상황에서 서버는 value의 상위 2바이트인 1234만 전송 받고 서버 프로그램이 종료되고
나머지 하위 2바이트 5678은 그냥 사라질 수 있지 않을 까요?

만약 맞다면, 혹시 그러면 위같 0x12345678 값을 전송할 때
unsigned char buf[4] = { 0x12, 0x34, 0x56, 0x78 }; 이렇게 전송하고 또 서버에서 이것을 조합해서
int형 변수로 만드는 잡업을 해야 하는 건가요?

패키 최소 단위가 바이트 라고 알고있는데
그래서 첫번쨰 코드는 옳바른 코드이고 두번째 코드는 위험한 코드 일까요?

긴글 읽어주셔서 감사합니다.

pynoos의 이미지

현재 TCP/IP 구현상 예제로 드신 정도는 문제가 발생할 일이 거의 없습니다.
그러나 2000 바이트 한 번 write, 한 번 read한다면 문제가 발생하죠. 보내는 동안 어떤 네트워크에서는 MSS 값에 걸려서 쪼개어 보내질 수 있습니다.
이럴 때를 대비해서 보낸 것의 단위를 알 수 있는 다른 방법이 필요합니다.

익명 사용자의 이미지

첫째 코드도 아주 좋은 코드라고 말하긴 어려워 보이는데요.
소켓에 대한 read가 항상 성공할 거라고 가정하고 있군요.

아마 온전한 프로그램을 만드는 데 필요한 내용을 가르치기 위한 중간 과정 같은 것이겠죠?

아무튼 원리는 맞습니다. tcp 통신에서는 상대방이 보낸 단위로 끊어서 받을 수 있을 것이라고 가정해선 안 됩니다.
인스턴트 메신저나 이메일처럼 편리하게 동작하지는 않는다는 것이죠. 그런 기능은 tcp보다 윗 레벨의 프로토콜에서 구현해야 합니다.

댓글 달기

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