CÁC BÀI THỰC HÀNH LINUX - Trang 36

- 35-

} /* while(read_line) */


} /* while (1) */


}


/* WARNING */
/* this function is experimental. I don't know yet if it works */

/* correctly or not. Use Steven's readline() function to have something robust.*/
/* rcv_line is my function readline(). Data is read from the socket when */

/* needed, but not byte after bytes. All the received data is read. */
/* This means only one call to recv(), instead of one call for each received byte. */

/* You can set END_CHAR to whatever means endofline for you. (0x0A is \n)*/
/* read_lin returns the number of bytes returned in line_to_return */


/* Hàm có chức năng đọc dữ liệu từ socket*/

int read_line(int newSd, char *line_to_return) {

static int rcv_ptr=0;
static char rcv_msg[MAX_MSG];

static int n;
int offset;


offset=0;


while(1) {

if(rcv_ptr==0) {
/* read data from socket */

memset(rcv_msg,0x0,MAX_MSG);

/* init buffer */

n = recv(newSd, rcv_msg, MAX_MSG, 0); /* wait for data */

if (n<0) {

perror(" cannot receive data ");

return

ERROR;

} else if (n==0) {

printf(" connection closed by client\n");

close(newSd);

return

ERROR;

}

}

/* if new data read on socket OR if another line is still in buffer */
/* copy line into 'line_to_return' */


while(*(rcv_msg+rcv_ptr)!=END_LINE && rcv_ptr<n) {

memcpy(line_to_return+offset,rcv_msg+rcv_ptr,1);
offset++;

rcv_ptr++;
}


/* end of line + end of buffer => return line */

if(rcv_ptr==n-1) {
/* set last byte to END_LINE */

*(line_to_return+offset)=END_LINE;
rcv_ptr=0;

return ++offset;
}