본문 바로가기
개발 업무(코딩)-개발자였을때 썼던..

tcp recv에 대한 고찰

by 주용사 2023. 1. 9.
728x90

tcp recv는 패킷길이가 10이라고 서로 규정을 하고 10을 보낸다하더라도

한번에 8이 올수도있고 10이 올수도 있다.

여러번으로 나뉘어 올 수도 있다는 것이다. 그렇기때문에 tcp recv로 받을 때는 패킷의 길이를 측정해서

나뉘어왔다면 붙여서 내려받는 방법이 있다.

int     Tcp_Recvn (int p_sfd, char *p_buf, int p_len)
{
    int     retry_cnt, msg_len;
    int     buf_sz;

    buf_sz = p_len;
    retry_cnt = 0;

    while (buf_sz > 0)
    {
        msg_len = recv (p_sfd, p_buf, buf_sz, 0);

        if (msg_len < 0)
        {
            if (SYS_NO == EAGAIN)
            {
                if (retry_cnt > 50)
                    return (NOTOK);

                retry_cnt ++;
                continue;
            }
            else
                return (msg_len);
        }
        else if (msg_len == 0)
            break;

        buf_sz -= msg_len;
        p_buf += msg_len;
    }

    if (retry_cnt > 5)
        printf("Tcp_Recvn:recv(EAGAIN) count[%d]", retry_cnt);

    return (p_len - buf_sz);
}
728x90