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

- 38-

#include <string.h> /* memset() */


#define LOCAL_SERVER_PORT 1500

#define MAX_MSG 100

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

int sd, rc, n, cliLen;
struct sockaddr_in cliAddr, servAddr;

char msg[MAX_MSG];

/* Tạo socket trên máy Server - Đặt tên cho socket của chương trình Server */

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

printf("%s: cannot open socket \n",argv[0]);
exit(1);

}

/* bind local server port – ràng buộc tên với socket */

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

servAddr.sin_port = htons(LOCAL_SERVER_PORT);
rc = bind (sd, (struct sockaddr *) &servAddr,sizeof(servAddr));


if(rc<0) {

printf("%s: cannot bind port number %d \n", argv[0], LOCAL_SERVER_PORT);
exit(1);

}

printf("%s: waiting for data on port UDP %u\n", argv[0],LOCAL_SERVER_PORT);

/* Thực hiện vòng lặp vô hạn trên Server để chờ và xử lý kết nối đến từ máy client */
while(1) {


/* Khởi tạo bộ đệm */

memset(msg,0x0,MAX_MSG);

/* Nhận dữ liệu gởi đến từ client */
cliLen = sizeof(cliAddr);

n = recvfrom(sd, msg, MAX_MSG, 0, (struct sockaddr *) &cliAddr, &cliLen);

if(n<0) {
printf("%s: cannot receive data \n",argv[0]);

continue;
}


/* In dữ liệu nhận được */

printf("%s: from %s:UDP%u : %s \n", argv[0],inet_ntoa(cliAddr.sin_addr),

ntohs(cliAddr.sin_port),msg);


}/*while*/

return 0;
}