/******************************************************************************/
/*
    FUNCTION :
             nRet = SendN(fd, buf, nbytes, &ret_nbytes);
    PARAMS :
             fd - file_descriptor
             buf - send_data_buffer
             nbytes - send_expect_len
             ret_nbytes - real_send_data_len
    RETURN :
             nRet > 0  : send_data_count
             nRet = 0  : error, short data send.
             nRet = -1 : error, fail.
             nRet = -2 : error, Operation would block.
CHECK : nRet && nbytes == ret_nbytes check...
*/
/******************************************************************************/
int SendN(int fd, void *buf, size_t nbytes, int *ret_nbytes)
{
    int nRemainLen = 0;
    int nSendCnt = 0;
    int nSendTotalCnt = 0;
char *ptr = NULL;
    /*** init_value ***/
    *ret_nbytes = 0;
    /*** fd_check ***/
    if(fd < 0) {
        fprintf(stderr, "Invalid fd(%d)\n", fd);
errno = EBADF;
        return (-1);
    }
    /*** send_data_check ***/
    if(buf == NULL) {
        fprintf(stderr, "Invalid data(%x)\n", buf);
errno = EINVAL;
        return (-1);
    }
    /*** send_size_check ***/
    if(nbytes <= 0) {
        fprintf(stderr, "Invalid send expect size(%d)\n", nbytes);
errno = EINVAL;
        return (-1);
    }
    /*** init_value ***/
    nRemainLen = nbytes;
    nSendTotalCnt = 0;
    /*** init_value ***/
    ptr = buf;
while (nRemainLen > 0) {
/*** int send(int s, const void *msg, size_t len, int flags); ***/
nSendCnt = send(fd, ptr, nRemainLen, MSG_NOSIGNAL);
if (nSendCnt < 0) {
if (errno == EINTR) { /* Interrupted system call */
                errno = 0;
                continue;          /* call send() again */
            }
            else if ((errno == EWOULDBLOCK) || (errno == EAGAIN)) {  /* Operation would block. buffer is full */
*ret_nbytes = nSendTotalCnt;
fprintf(stderr, "ERROR_FAIL send nSendCnt[%d] errno[%d][%s] nSendTotalCnt[%d]\n", nSendCnt, errno, strerror(errno), nSendTotalCnt);
return (-2); /* error */
            }
            else {  /* error_broken */
*ret_nbytes = nSendTotalCnt;
fprintf(stderr, "ERROR_FAIL send nSendCnt[%d] errno[%d][%s] nSendTotalCnt[%d]\n", nSendCnt, errno, strerror(errno), nSendTotalCnt);
return (-1); /* error */
}
        }
        else if(nSendCnt == 0) {
*ret_nbytes = nSendTotalCnt;
fprintf(stderr, "ERROR_FAIL send nSendCnt[%d] errno[%d][%s] nSendTotalCnt[%d]\n", nSendCnt, errno, strerror(errno), nSendTotalCnt);
return 0; /* error */
        }
        else {
ptr += nSendCnt;
            nRemainLen -= nSendCnt;
            nSendTotalCnt += nSendCnt;
}
}
*ret_nbytes = nSendTotalCnt;
return nSendTotalCnt;
}
/******************************************************************************/
/*
    FUNCTION :
             nRet = RecvN(fd, buf, nbytes);
    PARAMS :
             fd - file_descriptor
             buf - recv_data_buffer
             nbytes - recv_expect_len
    RETURN :
             nRet > 0  : recv_data_count
             nRet = 0  : eof data recv - short data recv. disconnect.
             nRet = -1 : error, fail.
             nRet = -2 : error, Operation would block.
    CHECK : nRet & nbytes check.... nRet and nbytes difference size enable..
*/
/******************************************************************************/
int RecvN(int fd, void *buf, size_t nbytes)
{
    int nRemainLen = 0;
    int nRecvCnt = 0;
    int nRecvTotalCnt = 0;
    /*** fd_check ***/
    if(fd < 0) {
        fprintf(stderr, "Invalid fd(%d)\n", fd);
errno = EBADF;
        return (-1);
    }
    /*** send_size_check ***/
    if(nbytes <= 0) {
        fprintf(stderr, "Invalid recv expect size\n", nbytes);
errno = EINVAL;
        return (-1);
    }
    /*** init_value ***/
    nRemainLen = nbytes;
    nRecvTotalCnt = 0;
    /*** loop_recv ***/
    while (nRemainLen > 0) {
/*** int recv(int s, void *buf, size_t len, int flags); ***/
nRecvCnt = recv(fd, buf, nRemainLen, 0);
if (nRecvCnt < 0) { /* read error? */
if (errno == EINTR) { /* interrupted? */
                errno = 0;
                continue;          /* restart the read */
            }
            else if ((errno == EWOULDBLOCK) || (errno == EAGAIN)) {  /* Operation would block : buffer is full */
fprintf(stderr, "ERROR_FAIL recv nRecvCnt[%d] errno[%d][%s] nRecvTotalCnt[%d]\n", nRecvCnt, errno, strerror(errno), nRecvTotalCnt);
return (-2); /* return error */
            }
            else {  /* error broken */
fprintf(stderr, "ERROR_FAIL recv nRecvCnt[%d] errno[%d][%s] nRecvTotalCnt[%d]\n", nRecvCnt, errno, strerror(errno), nRecvTotalCnt);
return (-1); /* return error */
}
        }
        else if (nRecvCnt == 0) {  /* EOF? */
fprintf(stderr, "ERROR_FAIL_EOF recv nRecvCnt[%d] errno[%d][%s] nRecvTotalCnt[%d]\n", nRecvCnt, errno, strerror(errno), nRecvTotalCnt);
return nRecvTotalCnt; /* return short count */
        }
        else {
buf += nRecvCnt;
            nRemainLen -= nRecvCnt;
            nRecvTotalCnt += nRecvCnt;
}
}
return nRecvTotalCnt;
}
/******************************************************************************/
static int Read(int fd, void *buf, size_t nbytes)
{
    int i = 0;
    int r = 0;
for (i = 0; i < 10; i++) {
r = read(fd, buf, nbytes);
if (r < 0) {
if(errno == EINTR) {
                errno = 0;
                continue;
}
break;
}
break;
}
if (i == 10) {
fprintf(stderr, "Too Many Interrupted FD[%d]\n", fd);
}
return r;
}
/******************************************************************************/
static int Recv(int fd, void *buf, size_t nbytes, int flags)
{
    int i = 0;
    int r = 0;
for (i = 0; i < 10; i++) {
r = recv(fd, buf, nbytes, flags);
if (r < 0) {
if(errno == EINTR) {
                errno = 0;
                continue;
}
break;
}
break;
}
if (i == 10) {
fprintf(stderr, "Too Many Interrupted FD[%d]\n", fd);
}
return r;
}
/******************************************************************************/










