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;
}

Liên Kết Chia Sẽ

** Đây là liên kết chia sẻ bới cộng đồng người dùng, chúng tôi không chịu trách nhiệm gì về nội dung của các thông tin này. Nếu có liên kết nào không phù hợp xin hãy báo cho admin.