패킷 처리에서 윈도우와 리눅스의 차이.

j8508의 이미지

리눅 초보 거미입니다.

윈도우에서 패킷을 처리하는 코드를 리눅스로 이식하려고 합니다.

그런데 윈도우에서의 패킷은 몇몇 부분이 바이트 순서가 변경된다고 하네요..

예를 들어 ip address 같은 것은 리눅스에서는 역순(이게 정상으로 알고 있음다)으로 나오지만, 윈도우에서는 정상적인 순서로 나오는걸로 알고 있습니다.

리눅스에서 받은 패킷의 어떤 부분들을 어떻게 바꿔야 윈도우에서 패킷 처리했던 코드를 그대로 사용할 수 있을까요..

고수님들 도와주세요~

bejoy4him의 이미지

바이트 순서가 바뀐다는것은 윈도우라서 바뀌는 것이 아니고...
CPU때문에 바뀌는 것으로 알고있습니다.

뭐.. Intel 계열 CPU들은 Little Endian,
모토롤라 계열(뭐 그냥 대충 그렇다는겁니다)은 Big Endian...

따라서 리눅스라고 해서 바꿀필요는 없겠네요...
뭐.. Win API나 MFC를 기반으로 해서 짜여진거라면 바꿀것이 좀 있겟지만
데이터를 받은 다음이라면 바꿀부분은 별루 없겟죠...

charsyam의 이미지

j8508 wrote:
리눅 초보 거미입니다.

윈도우에서 패킷을 처리하는 코드를 리눅스로 이식하려고 합니다.

그런데 윈도우에서의 패킷은 몇몇 부분이 바이트 순서가 변경된다고 하네요..

예를 들어 ip address 같은 것은 리눅스에서는 역순(이게 정상으로 알고 있음다)으로 나오지만, 윈도우에서는 정상적인 순서로 나오는걸로 알고 있습니다.

리눅스에서 받은 패킷의 어떤 부분들을 어떻게 바꿔야 윈도우에서 패킷 처리했던 코드를 그대로 사용할 수 있을까요..

고수님들 도와주세요~

CPU 타입 때문입니다. 위에 분이 제대로 답변해주셨네요.

intel 계열은 Little Endian, 모토롤라 쪽은 Big Endian입니다.

0x12345678 이라는 데이터가 있을 때

Little Endian 은 메모리에 0x78563412 로 저장됩니다.
Big Endian은 0x12345678 그대로 저장됩니다. 고운 하루되시길...

=========================
CharSyam ^^ --- 고운 하루
=========================

j8508의 이미지

endian 문제가 아닌걸로 알고 있는데.. 제가 잘못알고 있을지도 모르겠어요

제가 알기론 패킷이 떠다닐때 IP address 등의 몇몇 영역이 거꾸로인 상태로 떠다닌다고 알고 있습니다..
근데 MS에서는 드라이버영역에 들어올때 벌써 이런 영역들이 바뀌어 있다고 알고 있습니다.

예를 들어서. 어떤 패킷을 통채로 받아서 스트링에 저장했을 경우에,

linux의 경우와 window의 경우가 다른 값이 저장된다고 알고 있습니다...
왜냐하면 위에서 말한것 같이 ip address 등의 몇몇 값이 리눅스에서는 표준에 맞게 역순이지만 윈도우에서는 그걸 바꾼걸로 알고 있거든요...

그런데 어떤 영역들이 그런건질 모르겠어요.. 가르쳐주세요~

charsyam의 이미지

j8508 wrote:
endian 문제가 아닌걸로 알고 있는데.. 제가 잘못알고 있을지도 모르겠어요

제가 알기론 패킷이 떠다닐때 IP address 등의 몇몇 영역이 거꾸로인 상태로 떠다닌다고 알고 있습니다..
근데 MS에서는 드라이버영역에 들어올때 벌써 이런 영역들이 바뀌어 있다고 알고 있습니다.

예를 들어서. 어떤 패킷을 통채로 받아서 스트링에 저장했을 경우에,

linux의 경우와 window의 경우가 다른 값이 저장된다고 알고 있습니다...
왜냐하면 위에서 말한것 같이 ip address 등의 몇몇 값이 리눅스에서는 표준에 맞게 역순이지만 윈도우에서는 그걸 바꾼걸로 알고 있거든요...

그런데 어떤 영역들이 그런건질 모르겠어요.. 가르쳐주세요~

흐음, 먼저 정확하게 아셔야 할 부분이 있습니다. 먼저 네트워크 프로토콜에서는 기본적으로 Big Endian 을 표준으로 삼습니다. 이 때는 호스트 바이트, 네트워크 바이트라고 하죠. 호스트 바이트는 현재 머신에서 CPU에 따른 타입
(Little 일수도 있고 Big 일수도 있습니다.) 네트워크 바이트는 Big Endian 입니다. 즉, 네트워크로 보내는 데이터는 기본적으로 Big Endian으로 바꿔줘야 합니다.(헤더나 이런 부분은 말이죠) 하지만, 만약 같은 CPU 타입이라면 단순히 일반적인 소켓통신을 할 때는 이런 부분을 고려할 필요가 없습니다. 문제가 될 경우는 로우 소켓과 같이 헤더 부분을 직접 건드리는 경우인데, 이럴 대는 Big Endian으로 바꿔주면 됩니다. 윈도우즈냐, 리눅스냐 그런차이는 아니라는 겁니다. 만약 그렇다면, 대부분의 머신에서 리눅스, 윈도우의 네트웍 통신이
제대로 되지 않아야 할겁니다. 고운 하루되세요.

=========================
CharSyam ^^ --- 고운 하루
=========================

j8508의 이미지

charsyam wrote:
문제가 될 경우는 로우 소켓과 같이 헤더 부분을 직접 건드리는 경우인데, 이럴 대는 Big Endian으로 바꿔주면 됩니다. 윈도우즈냐, 리눅스냐 그런차이는 아니라는 겁니다. 만약 그렇다면, 대부분의 머신에서 리눅스, 윈도우의 네트웍 통신이
제대로 되지 않아야 할겁니다.

제가 지금 로우 소켓을 건딜고 있어요 T-T
리눅스에서는 커널모듈에서 sk_buff로 놀구 있구요..
윈도우에서도 마찬가지에요..
그래서 윈도우에서 쓰던 패킷 처리하던 함수를 그냥 갖다 쓸수가 없더라구요.

그래서.. 일일이 함수들을 찾아서 바꾸는게 아니라..
윈도우에서와 같은 순서로 sk_buff의 일부를 바꾸려구요...

어디어디의 순서를 바꿔야 하는지 가르쳐주세요~

댓글 달기

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