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

- 34-

int main (int argc, char *argv[]) {


int sd, newSd, cliLen;


struct sockaddr_in cliAddr, servAddr;

char line[MAX_MSG];


/* Gán các giá trị cho đối tượng socket.

Tạo socket cho máy Server. Lưu lại số mô tả socket */

sd = socket(AF_INET, SOCK_STREAM, 0);
if(sd<0) {

perror("cannot open socket ");
return ERROR;

}

/* Đặt tên socket cho chương trình Server
Gán

địa chỉ kết nối cho socket theo giao thức Internet */

servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);

servAddr.sin_port = htons(SERVER_PORT);

if(bind(sd, (struct sockaddr *) &servAddr, sizeof(servAddr))<0) {
perror("cannot bind port ");

return ERROR;
}


/* Tạo hàng đợi lắng nghe kết nối của client

Cho phép hàng đợi nhận tối đa 5 kết nối */

listen(sd,5);


/* Lặp liên tục chờ và lxy kết nối của client */

while(1) {

printf("%s: waiting for data on port TCP %u\n",argv[0],SERVER_PORT);
cliLen = sizeof(cliAddr);


/* Chấp nhận kết nối */

newSd = accept(sd, (struct sockaddr *) &cliAddr, &cliLen);
if(newSd<0) {

perror("cannot accept connection ");
return ERROR;

}

/* init line */
memset(line,0x0,MAX_MSG);


/* Đọc dữ liệu do Client gởi đến - xử lý dữ liệu nhận được */

while(read_line(newSd,line)!=ERROR) {

printf("%s: received from %s:TCP%d : %s\n", argv[0], inet_ntoa(cliAddr.sin_addr),

ntohs(cliAddr.sin_port), line);


/* init line */

memset(line,0x0,MAX_MSG);