블로그 이미지
초보 용사 꼬마라크. 그림은 만렙 용사 아랑소드 -네이버웹툰 아스란영웅전 발췌
꼬마라크

Notice

Archive

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
  • total
  • today
  • yesterday
2007. 12. 14. 21:58 Programmer/Network Prog.

드디어 오늘 적으려했던 주제에 도달.

send()함수에 넣어주는 param으로 char형 포인터가 있다. 요놈을 메세지라 부르지;;

난 여지껏 char *라길래.....-_- 정말 char 포인터를 만들어서 넣어주었지...배열로;;-_- 요놈을 버퍼라 부르더군... 캐릭터어레이;

이것이 바로 삽질의 기초;;-_- 모르면 그냥 해라



그제 충격적인 사실을 알았다..-_-

저기 저 char포인터대신 스트럭쳐가 들어가도 된다더라...

-_-!!!!!!! 어찌 이런일이..란느 생각뿐;;


부끄럽지만 다음엔 삽질하지 말자는 마음으로..공개하것다.

나름 머리를 쓴거지;; 데이터를 주고받을때 structure로 관리하면 편하것지? 하면서 일단 structure만들어 주시고
데이타 저기다 다 넣어 주시고..
저걸 다시 한바이트씩 짤라서 캐릭터 어레이에 한칸씩 채워준다음에
send(chararray)했다는 사실...

웃자 :D


엔 충격적인 사실..

데이터를 structure로 관리하는건 맞다. 다만 보낼때...캐스트를 쓰면 된다-_-
send((char*)structure)

-_- 이 어찌 충격이라 말하지 아니할수 있단말인가..

이 간단한걸 생각해 내지 못하고 그 삽질을.. 하다니..



오늘 실습시간에 역시 확인사살을 받았다..

조교 曰
ip패킷의 스트럭쳐를 보시면 아시겠지만..주고받을때 스트럭쳐로 하는게 맞습니다.-_-



ip패킷 스트럭쳐야 보긴 수없이 봤다만.. 본것만이 다가 아니고 내가 이해한것만이 다가 아니다라는 것을 배웠다
(제대로 이해해야 다지..)

'Programmer > Network Prog.' 카테고리의 다른 글

[링크]Socket 이란?  (0) 2007.12.14
[링크]socket-client에 bind없는 이유  (0) 2007.12.14
connection-oriented와 connectionless 의 차이  (0) 2007.12.14
#pragma pack()  (0) 2007.12.14
host byte order와 network byte order  (0) 2007.12.14
posted by 꼬마라크
2007. 12. 14. 21:57 Programmer/Network Prog.
host byte order와 network byte order

말그대로 host (자기컴퓨터)에서 사용하는 byte의 순서
그리고 네트워크에서 사용하는 바이트의 순서

컴퓨터 통신에 있어서 이 순서는 매우 심각한(난감한?) 결과를 가져올수 있다..-_-


이전의 little endian과 big endian의 차이인데

little endian 을 사용하는 컴퓨터에서 big endian을 사용하는 컴퓨터와 통신을 하려고 하면...?

data = 0x 12 34 56 78

요놈을 A(little endian)에서 B(big endian)으로 보낸다고 해보자..

통신이라는 것이 순서대로 주고받는것임을 명심해야 한다.

MSB부터 가든.. LSB부터 가든..(대부분 MSB부터 가더라, LSB부터 가는게 있는지는 확인못해봄-없나?)
A의 메모리에 들어있는 데이터는 little endian이므로
78 56 34 12

12 34 56 78
------------->
(4) (3) (2) (1) 이래 보내면 받는쪽에서는

78 56 34 12
------------->
(1) (2) (3) (4)의 순으로 받는다(당연한가?)

이 받을것을 가지고 저장을 하려면..
1)little endian의 경우 먼저온것(MSB)이 앞에 저장된다
78 56 34 12 -> 요걸 사용할때는 0x12 34 56 78으로 쓰는것

2) big endian의경우 도 먼저온것을 앞에 저장해야 겠지?
78 56 34 12 -> 요걸 사용하려면 그냥 쓰면 된다 0x 78 56 34 12

여기서 숫자가 바뀐다.

그래서 합의한 것이 network byte order. 네트워크에서 사용하는 바이트의 순서를 정하자라는것이다.

결론부터 말하자면 네트웍 바이트 오더는 빅엔디안과 같다.(빅 엔디안을 사용한다)

즉.. 보낼때는 네트웍바이트 오더로 바꿔서 보내고 받아서 자기가 쓰는걸로 바꿔라라는 컨셉

인텔에서 보내려 할때
0x12345678 이라는 값은 메모리에 78 56 34 12로 저장이 되어있는데
요건 리틀엔디안이므로 빅엔디안으로 바꿔서(12 34 56 78) 앞의 번지부터 보낸다.

모토로라에서 받은것은 12 34 56 78
이것이 메모리에 들어갈때도 12 34 56 78
이걸 이제 모토로라에서 사용가능한 오더로 바꾸면..(사실 바꿀필요 없다)
12 34 56 78로 메모리에 저장이 되고, 사용도 12 34 56 78로 쓰면 된다.

이것을 어떤 함수가 하느냐?
ntoh 와 hton이다. 각각 long와 short 타입이 있다, (ntohl, ntohs, htonl, htons)
의미는 글자그대로.. network to host, host to network

저 함수안을 안들여다 봤지만..
ifdef와 같이 선언되어있을것으로 생각된다.(유저는 알필요없다)

즉, 인텔이든 모토로라든 hton을 부르면 네트웍오더(빅엔디안)으로 바꿔주고(인텔의 경우 오더바꿈, 모토로라는 그대로 리턴)
ntoh를 부르면 호스트오더로 바꿔준다.(인텔이면 오더를 바꾸고, 모토로라는 그대로 리턴)



'Programmer > Network Prog.' 카테고리의 다른 글

[링크]Socket 이란?  (0) 2007.12.14
[링크]socket-client에 bind없는 이유  (0) 2007.12.14
connection-oriented와 connectionless 의 차이  (0) 2007.12.14
#pragma pack()  (0) 2007.12.14
buffer와 structure  (0) 2007.12.14
posted by 꼬마라크