TCP_ECHO_APP 분석

5
TCP_ECHO_APP 분분 JSYOON 2010. 1. 6

description

TCP_ECHO_APP 분석. JSYOON 2010. 1. 6. Buffer for send/ recv in TCP. Packets are not discrete data in TCP. They are flow !. recv ( socket, app_buff , sizeof ( app_buff ), flags ) returns recv_length. Server side. Flow Control by TCP. Client side. APP. Recv_Buffer. Send_Buffer. - PowerPoint PPT Presentation

Transcript of TCP_ECHO_APP 분석

Page 1: TCP_ECHO_APP  분석

TCP_ECHO_APP 분석

JSYOON2010. 1. 6

Page 2: TCP_ECHO_APP  분석

Buffer for send/recv in TCP

• Packets are not discrete data in TCP.They are flow !

Recv_Buffer

APP

Client side

recv ( socket, app_buff, sizeof(app_buff), flags)returns recv_length

Server side

Send_Buffer

Recv_Buffer

Send_Buffer

Flow Control by TCP

APP

send ( socket, app_buff, sizeof(app_buff), flags)returns send_length

Page 3: TCP_ECHO_APP  분석

Example

Recv_Buffer

APP

Client sideServer side

Send_Buffer

Recv_Buffer

Send_Buffer

Flow Control by TCP

APP

• APP_Buff size: 5

APP_Buff

APP_Buff

abcde

recv ( socket, app_buff, sizeof(app_buff), flags)returns recv_length

send ( socket, app_buff, sizeof(app_buff), flags)returns send_length

Page 4: TCP_ECHO_APP  분석

recvn( )1. int2. recvn(SOCKET s, char *buf, int len, int flags)3. {4. int received;5. char *ptr = buf;6. int left = len;

7. while (left > 0)8. {9. received = recv(s, ptr, left,

flags);10. if (received == SOCKET_ERROR)11. {12. return

SOCKET_ERROR;13. }14. else if (received == 0)15. {16. break;17. }18. left -= received;19. ptr += received;20. }21. return (len - left);22. }

• recvn (socket ID, stored buffer, buffer size, flags)

• Loop until (left buffer size > 0)

• take amount of left buffer size from TCP_RECV_BUFFERthen return recv_size

• if recv_size is zero, it doesn’t do anything

• left buffer size is reduced by recv_size

• pointer has to increase as recv_size

Page 5: TCP_ECHO_APP  분석

Modified recvn( )1. while (1)2. {

r_len=recv(sock, r_buf, BUFSIZE, 0);

3. if (r_len==0 || r_len==s_len)

4. {5. break;6. }7. }

• Do Loop

• Take data from TCP_RECV_BUFFER as much as sizeof(r_buf)

• If recv_data size is zero or recv_data is the same as sent data size, then the loop is finished