1 | #include "unp.h" |
---|
2 | |
---|
3 | int main(int argc, char ** argv) |
---|
4 | { |
---|
5 | int maxfdp1, |
---|
6 | listenfd, |
---|
7 | connfd, |
---|
8 | nready, |
---|
9 | udpfd; |
---|
10 | char mesg[MAXLINE]; |
---|
11 | pid_t childpid; |
---|
12 | fd_set rset; |
---|
13 | ssize_t n; |
---|
14 | socklen_t clilen, |
---|
15 | len; |
---|
16 | const int on = 1; |
---|
17 | struct sockaddr_in cliaddr, |
---|
18 | servaddr; |
---|
19 | void sig_chld(int); |
---|
20 | |
---|
21 | listenfd = Socket(AF_INET, SOCK_STREAM, 0); /* create listening TCP socket */ |
---|
22 | |
---|
23 | bzero(&servaddr, sizeof(servaddr)); |
---|
24 | servaddr.sin_family = AF_INET; |
---|
25 | servaddr.sin_addr.s_addr = htonl(INADDR_ANY); |
---|
26 | servaddr.sin_port = htons(SERV_PORT); |
---|
27 | |
---|
28 | setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &(on), sizeof(on)); |
---|
29 | bind(listenfd, (SA *)&servaddr, sizeof(servaddr)); |
---|
30 | |
---|
31 | Listen(listenfd, LISTENQ); |
---|
32 | |
---|
33 | udpfd = Socket(AF_INET, SOCK_DGRAM, 0); /* create UDP socket */ |
---|
34 | |
---|
35 | bzero(&servaddr, sizeof(servaddr)); |
---|
36 | servaddr.sin_family = AF_INET; |
---|
37 | servaddr.sin_addr.s_addr = htonl(INADDR_ANY); |
---|
38 | servaddr.sin_port = htons(SERV_PORT); |
---|
39 | |
---|
40 | bind(udpfd, (SA *)&servaddr, sizeof(servaddr)); |
---|
41 | |
---|
42 | signal(SIGCHLD, sig_chld); /* must call waitpid() */ |
---|
43 | |
---|
44 | FD_ZERO(&(rset)); |
---|
45 | maxfdp1 = max(listenfd, udpfd) + 1; |
---|
46 | |
---|
47 | for ( ; ; ) |
---|
48 | { |
---|
49 | FD_SET(listenfd,&(rset)); |
---|
50 | FD_SET(udpfd,&(rset)); |
---|
51 | |
---|
52 | if ( (nready = select(maxfdp1, &(rset), NULL, NULL, NULL)) < 0 ) |
---|
53 | { |
---|
54 | if ( errno == EINTR ) |
---|
55 | continue; /* back to for() */ |
---|
56 | else |
---|
57 | err_sys("select error"); |
---|
58 | } |
---|
59 | if ( FD_ISSET(listenfd, &(rset)) ) |
---|
60 | { |
---|
61 | len = sizeof(cliaddr); |
---|
62 | connfd = accept(listenfd, (SA *) &(cliaddr), &(len)); |
---|
63 | |
---|
64 | if ( childpid = fork() == 0 ) /* child process */ |
---|
65 | { |
---|
66 | close(listenfd); /* close listening socket */ |
---|
67 | str_echo(connfd); /* process request */ |
---|
68 | exit(0); |
---|
69 | } |
---|
70 | close(connfd); /* parent closes connected socket */ |
---|
71 | } |
---|
72 | if ( FD_ISSET(udpfd, &(rset)) ) |
---|
73 | { |
---|
74 | len = sizeof(cliaddr); |
---|
75 | n = recvfrom(udpfd, mesg, MAXLINE, 0, (SA *) &(cliaddr), &(len)); |
---|
76 | sendto(udpfd, mesg, n, 0, (SA *) &(cliaddr), len); |
---|
77 | } |
---|
78 | |
---|
79 | } |
---|
80 | |
---|
81 | return 0; |
---|
82 | } |
---|