TCPSendRecv - 8BitsCoding/RobotMentor GitHub Wiki

TCPSendRecv

Little and Big Endian ์•Œ๊ธฐ

Little Endian

Intel CPU ๊ณ„์—ด์—์„œ ์‚ฌ์šฉ๋จ

๋ฐ์ดํ„ฐ : 0x01 02 03 04 ๋ผ๋ฉด

๋ฉ”๋ชจ๋ฆฌ : 04 03 02 01 ์œผ๋กœ ์ €์žฅ์ด๋œ๋‹ค.

ํ•œ ๋งˆ๋””๋กœ

์ฃผ์†Œ 3๋ฒˆ | ์ฃผ์†Œ 2๋ฒˆ | ์ฃผ์†Œ 1๋ฒˆ | ์ฃผ์†Œ 0๋ฒˆ |
04 | 03 | 02 | 01

์ด๋ฏธ์ง€


Big Endian

Network์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์—”๋””์–ธ

๋ฐ์ดํ„ฐ : 0x01 02 03 04

๋ฉ”๋ชจ๋ฆฌ : 01 02 03 04

์ฃผ์†Œ 0๋ฒˆ | ์ฃผ์†Œ 1๋ฒˆ | ์ฃผ์†Œ 2๋ฒˆ | ์ฃผ์†Œ 3๋ฒˆ |
01 | 02 | 03 | 04

์ด๋ฏธ์ง€


Example2 ๋งŒ ๋ณด๋ฉด๋จ.

Example

App1.

๋ฐ์ดํ„ฐ : 0x01 02 03 04

๋ฉ”๋ชจ๋ฆฌ : 04 03 02 01

<๋„คํŠธ์›Œํฌ๋กœ ์†ก์‹ >

Net.

01 02 03 04

<๋„คํŠธ์›Œํฌ๋กœ ์†ก์‹ >

App2.

์ฃผ์†Œ๊ฐ’ 04 | ์ฃผ์†Œ๊ฐ’ 03 | ์ฃผ์†Œ๊ฐ’ 02 | ์ฃผ์†Œ๊ฐ’ 01
๋ฉ”๋ชจ๋ฆฌ : 01 02 03 04 (์ด๋ ‡๊ฒŒ ์ฝ์–ด์˜ค๋Š” ์ด์œ ? Net.์€ Big Endian 04 -> 03 -> 02 -> 01 ์ˆœ์œผ๋กœ ๋ณด๋‚ด๊ณ  App2๋Š” Little Endian์œผ๋กœ ์ฃผ์†Œ๊ฐ’ 01 -> 02 -> 03 -> 04 ์ˆœ์œผ๋กœ ์ €์žฅ๋œ๋‹ค.)

๋ฐ์ดํ„ฐ : 04 03 02 01


Example2 - ๋ฐ์ดํ„ฐ๊ฐ€ ๋’ค์ง‘ํ˜€ ๋“ค์–ด์˜ค๊ฒŒ ๋œ๋‹ค / ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋‚˜??

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์ด ์–ด๋ ค๊ฐœ์ž„ ์•„๋Š”ํ•œ ๋ชจ๋‘ ์„ค๋ช…

App1.

๋ฐ์ดํ„ฐ : 0x12 34 56 78

<๋ฉ”๋ชจ๋ฆฌ ์Šค์™‘> (๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์Šค์™‘ํ•˜๋Š” ์ด์œ ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๊ฒ ์ง€๋งŒ ๋„คํŠธ์›Œํฌ์—์„œ ๋ณด๊ธฐ ์ข‹๊ฒŒ(์›ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌํ˜•ํƒœ๋กœ) ํ•˜๊ธฐ ์œ„ํ•ด์„œ๊ฐ€ ๊ฐ€์žฅํฌ๋‹ค.)

์ด๋ฏธ์ง€

๋ฉ”๋ชจ๋ฆฌ : 78 56 34 12

<๋„คํŠธ์›Œํฌ๋กœ ์†ก์‹ >

Net.

12 34 56 78

์ด๋ฏธ์ง€

<๋„คํŠธ์›Œํฌ๋กœ ์†ก์‹ >

App2.

App2์—์„œ ์ˆ˜์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‘ ๊ฐ€์ง€์ด๋‹ค.

๋ฐฉ๋ฒ•1 - memcpy

๋ฉ”๋ชจ๋ฆฌ : 04 03 02 01

๋ฐ์ดํ„ฐ : 01 02 03 04

์ด๋ฏธ์ง€

App2.


์ด๋ฏธ์ง€

์™€์ด์–ด ์ƒคํฌ์—์„œ TCP ํ†ต์‹ ์„์ฐ์–ด๋ณธ ๊ทธ๋ฆผ

๋ณด๋‚ด๋Š” ์ชฝ์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ๋ณด๋ƒˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.


Sender

์ด๋ฏธ์ง€

_message.RBitResultReportSwap.nresult = 1;

_message.RBitResultReportSwap.MessageHeader.uiMsgID = 0x03002010;
_message.RBitResultReportSwap.MessageHeader.uiMsgCount = 0;
_message.RBitResultReportSwap.MessageHeader.uiMsgLength = sizeof(_message.RBitResultReportSwap) - sizeof(_message.RBitResultReportSwap.MessageHeader);

_message.RBitResultReportSwap.MessageHeader.uiMsgCount = _message.SWap32(_message.RBitResultReportSwap.MessageHeader.uiMsgCount);
_message.RBitResultReportSwap.MessageHeader.uiMsgLength = _message.SWap32(_message.RBitResultReportSwap.MessageHeader.uiMsgLength);
_message.RBitResultReportSwap.nresult = _message.SWap32(_message.RBitResultReportSwap.nresult);


write(sockfd,(char *)&_message.RBitResultReportSwap,sizeof(_message.RBitResultReportSwap));

(์ฐธ๊ณ ) 8bit / 1byte / 64bytes

0xff ff ff ff ๋Š” ๋ช‡ ๋ฐ”์ดํŠธ์ผ๊นŒ?

8bit๊ฐ€ 1byte์ž„์„ ์•ˆ๋‹ค

f = 1111 = 4bits์ด๊ณ 

ff = 1111 1111 = 8bits = 1bytes์ด๋‹ค.

๋”ฐ๋ผ์„œ

0xff ff ff ff = 4bytes์ด๋‹ค.


(์ฐธ๊ณ ) ๋ฐ”์ดํŠธ ์Šค์œ„์นญ

#define CH_2BYTE(type)		SwapTwoByte((unsigned char *)&type, (unsigned char *)&type)        
#define CH_4BYTE(type)		SwapFourByte((unsigned char *)&type, (unsigned char *)&type)       
#define CH_8BYTE(type)		SwapEightByte((unsigned char *)&type, (unsigned char *)&type)  
template <class type> 
void	SwapThreeByte(type *source, type *dest)                              
{                                                                            
	unsigned char temp[3];                                                             
	temp[0] = source[2];                                                       
	temp[1] = source[1];                                                       
	temp[2] = source[0];                                                       
	memcpy(dest, temp, 3);                                                     
}        
template <class type> 
void	SwapTwoByte(type *source, type *dest)                                
{                                                                            
	unsigned char temp[2];                                                             
	temp[0] = source[1];                                                       
	temp[1] = source[0];                                                       
	memcpy(dest, temp, 2);                                                     
}      
template <class type>
void	SwapBytes(type *source, int length)                                   
{                                                                            
	unsigned char temp;                                                                

	for ( int i=0; i<length; i+=2)                                             
	{                                                                          
		temp = source[i];                                                        
		source[i] = source[i+1];                                                 
		source[i+1] = temp;                                                      
	}                                                                          
}        
โš ๏ธ **GitHub.com Fallback** โš ๏ธ