Broadcasting and UDP Network Lab Broadcast UDP broadcast
Broadcasting and UDP Network Lab. 남 재 준
목 차 < Broadcast UDP 소켓 설치 < 소켓을 사용하여 broadcast message 보내기 < 소켓을 사용하여 broadcast message 받기 http: //netwk. hannam. ac. kr 2 HANNAM UNIVERSITY
Broadcast Address < ifconfig eth 0 Ethernet Interface를 위한 broadcast address # ifconfig eth 0 Link encap: Ehternet Hwaddr 00: A 0: 4 B: 06: F 4: 8 D inet addr: 192. 168. 0. 1 Bcast: 192. 168. 0. 255 Mask: 255. 0 UP BROADCAST RUNNING PROMISC MULTICAST MTU: 1500 Metric: 1 RX packets: 1955 error: 0 dropped: 0 overruns: 0 frame: 31 collision: 0 txqueuelen: 100 Interrupt: 9 Bass address: 0 xe 400 # http: //netwk. hannam. ac. kr 3 HANNAM UNIVERSITY
Broadcast Address < ifconfig eth 0 # ifconfig eth 0 Link encap: Ehternet Hwaddr 00: A 0: 4 B: 06: F 4: 8 D inet addr: 192. 168. 0. 1 Bcast: 192. 168. 0. 255 Mask: 255. 0 UP BROADCAST RUNNING PROMISC MULTICAST MTU: 1500 Metric: 1 RX packets: 1955 error: 0 dropped: 0 overruns: 0 frame: 31 collision: 0 txqueuelen: 100 Interrupt: 9 Bass address: 0 xe 400 # http: //netwk. hannam. ac. kr 192. 168. 0. 255 Network ID Host ID - C Class address 4 HANNAM UNIVERSITY
Broadcast Address < 255 Ü broadcasting을 위해서 사용될 수 있다. Ü 대량의 broadcast를 제한하고 있다. Ü 개념정의가 미비한 상태 Ü 모든 network interface들을 위해 사용 Ü 여러 interface 중 단 하나를 선택 Ü 일반적인 broadcast address 사용이 제지 된다. http: //netwk. hannam. ac. kr 5 HANNAM UNIVERSITY
Broadcast 하기 위해 < Interface 이름 결정 < interface의 broadcast address 결정 < broadcast address를 broadcast < 추가된 interface에 반복 http: //netwk. hannam. ac. kr 6 HANNAM UNIVERSITY
mkaddr. c 확장 $ diff. . /ch. 11/mkaddr. c 99, 102 c 99, 100 < ap. >sin_addr. s_addr = < inet_addr(host_part); < if (ap->sin_addr. s_addr == INADDR_NONE) Invalid address INADDR_NONE 255 (32 bit convert) INADDR_NONE . . > > $ if (!inet_aton(host_part, &ap->sin_addr) ) http: //netwk. hannam. ac. kr General broadcast address (255. 255)와 bad IP address의 구별을 위해 7 HANNAM UNIVERSITY
Broadcasting from a Server Command-line Create Server address Create Broadcast address Update by gen_quote( ) Create Socket Index Buffer Bind serve address Initialize Index http: //netwk. hannam. ac. kr Send by sendto( ) Time delay Sleep ( ) 8 HANNAM UNIVERSITY
Broadcasting from a Server < Socket은 SO_BROADCAST option을 가 지고 있어야 한다. < sendto( ) 함수의 destination address Broadcast address http: //netwk. hannam. ac. kr 9 HANNAM UNIVERSITY
Receiving Broadcasting Command-line Create Socket Broadcast address is Formed Bind Broadcast address http: //netwk. hannam. ac. kr Begin broadcast receiving loop Receive broadcast Write Broadcast Info. 10 HANNAM UNIVERSITY
Receiving Broadcasting < Broadcast를 수신하기 위해서 client program은 Socket에 bind된 address를 가지고 있어야 한다. < SO_REUSEADDR Ü multiple client가 같은 host에 같은 broadcast address로부터 수신하도록 허락 http: //netwk. hannam. ac. kr 11 HANNAM UNIVERSITY
Broadcast Demo. @pepper $. /stksrv 127. 255: 9097 & [1] 756 @pepper $ http: //netwk. hannam. ac. kr 12 HANNAM UNIVERSITY
Broadcast Demo. $. /gquotes 127. 255: 9097 DJIA NASDQ S&P 500 TSE 300 10302. 06 -1. 24 2766. 86 +5. 11 1285. 48 +2. 17 6897. 99 +2. 27 DJIA NASDQ S&P 500 TSE 300 [CTRL+C] @pepper $ 10302. 06 -1. 24 2766. 86 +5. 11 1285. 48 +2. 17 6897. 99 +2. 27 http: //netwk. hannam. ac. kr 13 HANNAM UNIVERSITY
Broadcast Demo. (to network) @pepper $. /stksrv 192. 168. 0. 255: 9097 '192. 168. 0. 1: *' & [2] 815 @pepper $ http: //netwk. hannam. ac. kr 14 HANNAM UNIVERSITY
Broadcast Demo. (to network) @pepper (192. 168. 0. 1) @slug (192. 168. 0. 2) $. /gquotes 192. 168. 0. 255: 9097 DJIA 10304. 73 +1. 43 NASDAQ 2761. 19 -0. 56 S&P 500 1283. 31 +0. 00 TSE 300 6895. 82 +0. 10 $. /gquotes 192. 168. 0. 255: 9097 DJIA 10309. 80 +6. 50 NASDQ 2767. 29 +5. 54 S&P 500 1286. 06 +2. 75 TSE 300 6897. 75 +2. 03 DJIA 10304. 73 +1. 43 NASDAQ 2761. 19 -0. 56 S&P 500 1283. 31 +0. 00 TSE 300 6896. 35 +0. 63 DJIA NASDQ S&P 500 TSE 300 http: //netwk. hannam. ac. kr 10309. 80 +6. 50 2767. 29 +5. 54 1286. 06 +2. 75 6897. 67 +1. 95 15 HANNAM UNIVERSITY
Server program Listing 13. 1 : stksrv. c-The Stock Market Index Broadcasting Server #define MAXQ /* stksrv. c: * * Example Stock Index Broadcast : */ #include <stdio. h> #include <unistd. h> #include <stdlib. h> #include <errno. h> #include <string. h> #include <time. h> #include <sys/types. h> #include <sys/socket. h> #include <netinet/in. h> #include <arpa/inet. h> static struct { char *index; int start; int volit; int current; #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif 4 #define MAXQ 4 /* * Randomly change one index quotation : */ static void gen_quote(void) short x; /* Index */ short v; /* Volatility of index */ short h; /* Half of v */ short r; /* Random change */ • Stock Market Index table static struct { char *index; int start; int volit; int current; } quotes[ ] = { { "DJIA", 1030330, 375 }, { "NASDAQ", 276175, 125} , { "S&P 500", 128331, 50 }, { "TSE 300", 689572, 75 }, }; /* * Initialize : */ static void initialize(void) short x; time_t td; x = rand() % MAXQ; v = quotes[x]. volit; h = (v / 2) - 2; r = rand() % v; if ( r < h ) r = -r; quotes[x]. current += r; } quotes[ ] = { • Simulation을 위한 data 구성 { "DJIA", 1030330, 375 }, /* extern int mkaddr( * This function reports the error and { "NASDAQ", 276175, 125} , void *addr, * exits back to the shell : int *addrlen, /* */ { "S&P 500", 128331, * Seed 50 the}, random number generator : char *str_addr, static void char *protocol); */ bail(const char *on_what) { "TSE 300", 689572, 75 }, time(&td); fputs(strerror(errno), stderr); srand((int)td); fputs(": ", stderr); }; fputs(on_what, stderr); http: //netwk. hannam. ac. kr for ( x=0; x < MAXQ; ++x ) quotes[x]. current = quotes[x]. start; fputc('', stderr); exit(1); 16 HANNAM UNIVERSITY
Server program Listing 13. 1 : stksrv. c-The Stock Market Index Broadcasting Server /* stksrv. c: * * Example Stock Index Broadcast : */ #include <stdio. h> #include <unistd. h> #include <stdlib. h> #include <errno. h> #include <string. h> #include <time. h> #include <sys/types. h> #include <sys/socket. h> #include <netinet/in. h> #include <arpa/inet. h> static void initialize(void) { short x; time_t td; #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif time(&td); srand((int)td); extern int mkaddr( void *addr, int *addrlen, char *str_addr, char *protocol); } #define MAXQ 4 static struct { char *index; int start; int volit; int current; } quotes[ ] = { { "DJIA", 1030330, 375 }, { "NASDAQ", 276175, 125} , { "S&P 500", 128331, 50 }, { "TSE 300", 689572, 75 }, }; • Simulation 초기화 /* * Initialize : */ static void initialize(void) short x; time_t td; x = rand() % MAXQ; v = quotes[x]. volit; h = (v / 2) - 2; r = rand() % v; if ( r < h ) r = -r; quotes[x]. current += r; • Random number 산출 /* ++x ) for ( x=0; x < MAXQ; * Seed the random number generator : quotes[x]. current*/= time(&td); quotes[x]. start; srand((int)td); http: //netwk. hannam. ac. kr /* * Randomly change one index quotation : */ static void gen_quote(void) short x; /* Index */ short v; /* Volatility of index */ short h; /* Half of v */ short r; /* Random change */ for ( x=0; x < MAXQ; ++x ) quotes[x]. current = quotes[x]. start; /* * This function reports the error and * exits back to the shell : */ static void bail(const char *on_what) fputs(strerror(errno), stderr); fputs(": ", stderr); fputs(on_what, stderr); fputc('', stderr); exit(1); 17 HANNAM UNIVERSITY
Server program Listing 13. 1 : stksrv. c-The Stock Market Index Broadcasting Server /* stksrv. c: * * Example Stock Index Broadcast : */ #include <stdio. h> #include <unistd. h> #include <stdlib. h> #include <errno. h> #include <string. h> #include <time. h> #include <sys/types. h> #include <sys/socket. h> #include <netinet/in. h> #include <arpa/inet. h> #define MAXQ static struct { char *index; int start; int volit; int current; } quotes[ ] = { { "DJIA", 1030330, 375 }, { "NASDAQ", 276175, 125} , { "S&P 500", 128331, 50 }, { "TSE 300", 689572, 75 }, }; • gen_quote( ) 호출 • Stock index change #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif extern int mkaddr( void *addr, int *addrlen, char *str_addr, char *protocol); http: //netwk. hannam. ac. kr 4 /* * Initialize : */ static void initialize(void) short x; time_t td; /* * Randomly change one index quotation : */ static void gen_quote(void) short x; /* Index */ short v; /* Volatility of index */ short h; /* Half of v */ short r; /* Random change */ static void gen_quote(void) { short x; /* Index */ short v; /* Volatility of index */ short h; x =/* Half of v */ rand() % MAXQ; = quotes[x]. volit; short r; vh /* Random change */ = (v / 2) - 2; r = rand() % v; if ( r < h ) r = -r; quotes[x]. current += r; x = rand() % MAXQ; v = quotes[x]. volit; h = (v / /**2) - 2; This function reports the error and * exits back to the shell : r = rand() % v; /* */ * Seed the random number generator : if ( r < hstatic ) void */ bail(const char *on_what) time(&td); r = -r; fputs(strerror(errno), stderr); srand((int)td); fputs(": ", stderr); fputs(on_what, stderr); quotes[x]. current += r; for ( x=0; x < MAXQ; ++x ) fputc('', stderr); quotes[x]. current = exit(1); } quotes[x]. start; 18 HANNAM UNIVERSITY
Server program Listing 13. 1 : stksrv. c-The Stock Market Index Broadcasting Server int main(int argc, char **argv) short x; /* index of Stock Indexes */ double I 0; /* Initial index value */ double I; /* Index value */ char bcbuf[512], *bp; /* Buffer and ptr */ int z; /* Status return code */ int s; /* Socket */ struct sockaddr_in adr_srvr; /* AF_INET */ int len_srvr; /* length */ struct sockaddr_in adr_bc; /* AF_INET */ int len_bc; /* length */ static int so_broadcast = TRUE; static char *sv_addr = "127. 0. 0. 1: *", *bc_addr = "127. 255: 9097"; z = mkaddr( &adr_srvr, /* Returned address */ &len_srvr, /* Returned length */ sv_addr, /* Input string addr */ "udp"); /* UDP protocol */ if ( z == -1 ) bail("Bad server address"); /* * Form the broadcast address : */ len_bc = sizeof adr_bc; if ( argc > 1 ) /* Broadcast address : */ bc_addr = argv[1]; /* * Form the server address : */ len_srvr = sizeof adr_srvr; http: //netwk. hannam. ac. kr * Allow broadcasts : */ z = setsockopt(s, SOL_SOCKET, SO_BROADCAST, &so_broadcast, sizeof so_broadcast); /* if ( z == -1 ) bail("setsockopt(SO_BROADCAST)"); * Form a packet to send out : */ bp = bcbuf; for ( x=0; x<MAXQ; ++x ) I 0 = quotes[x]. start / 100. 0; I = quotes[x]. current / 100. 0; sprintf(bp, "%-7. 7 s %8. 2 f %+. 2 f", quotes[x]. index, I, I - I 0); bp += strlen(bp); • Default address 선언 /* * Bind a address to our socket, argument so that • No command-line *sv_addr = "127. 0. 0. 1: *", z = mkaddr( &adr_bc, /* Returned address */ *bc_addr = "127. 255: 9097"; &len_bc, /* Returned length */ /* * Form a server address : */ if ( argc > 2 ) /* Server address : */ sv_addr = argv[2]; /* bc_addr, /* Input string addr */ "udp"); /* UDP protocol */ if ( z == -1 ) bail("Bad broadcast address"); /* * Create a UDP socket to use : */ s = socket(AF_INET, SOCK_DGRAM, 0); if ( s == -1 ) bail("socket()"); * client programs can listen to this * server: */ z = bind(s, (struct sockaddr *)&adr_srvr, len_srvr); if ( z == -1 ) bail("bind()"); /* * Broadcast the updated info: */ z = sendto(s, bcbuf, strlen(bcbuf), 0, (struct sockaddr *)&adr_bc, len_bc); /* * Now start serving quotes : */ initialize(); for (; ; ) /* * Update one quote in the list: */ gen_quote(); if ( z == -1 ) bail("sendto()"); sleep(4); return 0; } 19 HANNAM UNIVERSITY
Server program Listing 13. 1 : stksrv. c-The Stock Market Index Broadcasting Server int main(int argc, char **argv) short x; /* index of Stock Indexes */ double I 0; /* Initial index value */ double I; /* Index value */ char bcbuf[512], *bp; /* Buffer and ptr */ int z; /* Status return code */ int s; /* Socket */ struct sockaddr_in adr_srvr; /* AF_INET */ int len_srvr; /* length */ struct sockaddr_in adr_bc; /* AF_INET */ int len_bc; /* length */ static int so_broadcast = TRUE; static char *sv_addr = "127. 0. 0. 1: *", *bc_addr = "127. 255: 9097"; /* * Form a server address : */ if ( argc > 2 ) /* Server address : */ sv_addr = argv[2]; z = mkaddr( &adr_srvr, /* Returned address */ &len_srvr, /* Returned length */ sv_addr, /* Input string addr */ "udp"); /* UDP protocol */ if ( z == -1 ) bail("Bad server address"); /* * Form the broadcast address : */ len_bc = sizeof adr_bc; bail("Bad broadcast address"); /* * Allow broadcasts : */ z = setsockopt(s, SOL_SOCKET, SO_BROADCAST, &so_broadcast, sizeof so_broadcast); /* if ( z == -1 ) bail("setsockopt(SO_BROADCAST)"); z = mkaddr( &adr_bc, /* Returned address */ &len_bc, /* Returned length */ bc_addr, /* Input string addr */ "udp"); /* UDP protocol */ if ( argc > 2 ) sv_addr = argv[2]; if ( z == -1 ) /* /* * Bind a address to our socket, so that * client programs can listen to this * server: */ z = bind(s, (struct sockaddr *)&adr_srvr, len_srvr); if ( z == -1 ) bail("bind()"); * Form a packet to send out : */ bp = bcbuf; for ( x=0; x<MAXQ; ++x ) I 0 = quotes[x]. start / 100. 0; I = quotes[x]. current / 100. 0; sprintf(bp, "%-7. 7 s %8. 2 f %+. 2 f", quotes[x]. index, I, I - I 0); bp += strlen(bp); /* * Broadcast the updated info: */ z = sendto(s, bcbuf, strlen(bcbuf), 0, (struct sockaddr *)&adr_bc, len_bc); • Two command-line argument • 2번째 변수로 server address를 취함 /* * Create a UDP socket to use : * Now start serving quotes : if ( argc > 1 ) */ */ if ( z == -1 ) • One or more command-line argument s = socket(AF_INET, SOCK_DGRAM, 0); initialize(); bail("sendto()"); bc_addr = argv[1]; if ( s == -1 ) sleep(4); • 1번째 변수로 broadcast address를 취함 /* bail("socket()"); for (; ; ) if ( argc > 1 ) /* Broadcast address : */ bc_addr = argv[1]; * Form the server address : */ len_srvr = sizeof adr_srvr; http: //netwk. hannam. ac. kr /* * Update one quote in the list: */ gen_quote(); return 0; } 20 HANNAM UNIVERSITY
Server program Listing 13. 1 : stksrv. c-The Stock Market Index Broadcasting Server int main(int argc, char **argv) short x; /* index of Stock Indexes */ double I 0; /* Initial index value */ double I; /* Index value */ char bcbuf[512], *bp; /* Buffer and ptr */ int z; /* Status return code */ int s; /* Socket */ struct sockaddr_in adr_srvr; /* AF_INET */ int len_srvr; /* length */ struct sockaddr_in adr_bc; /* AF_INET */ int len_bc; /* length */ static int so_broadcast = TRUE; static char *sv_addr = "127. 0. 0. 1: *", *bc_addr = "127. 255: 9097"; /* len_srvr = sizeof adr_srvr; * Form the server address : */ len_srvr = sizeof adr_srvr; z = mkaddr( &adr_srvr, /* Returned address */ &len_srvr, /* Returned length */ sv_addr, /* Input string addr */ "udp"); /* UDP protocol */ */ len_bc = sizeof adr_bc; if ( z == -1 ) z = mkaddr( &adr_bc, /* Returned address */ bail("Bad server address"); &len_bc, /* Returned length */ if ( argc > 1 ) /* Broadcast address : */ bc_addr = argv[1]; http: //netwk. hannam. ac. kr * Allow broadcasts : */ z = setsockopt(s, SOL_SOCKET, SO_BROADCAST, &so_broadcast, sizeof so_broadcast); /* • Server address 형성 z = mkaddr( &adr_srvr, /* Returned address */ &len_srvr, /* Returned length */ if ( z == -1 ) server address"); sv_addr, /* Input bail("Bad string addr */ /* "udp"); /* UDP protocol */ * Form the broadcast address : /* * Form a server address : */ if ( argc > 2 ) /* Server address : */ sv_addr = argv[2]; /* bc_addr, /* Input string addr */ "udp"); /* UDP protocol */ if ( z == -1 ) bail("Bad broadcast address"); /* * Create a UDP socket to use : */ s = socket(AF_INET, SOCK_DGRAM, 0); if ( s == -1 ) bail("socket()"); if ( z == -1 ) bail("setsockopt(SO_BROADCAST)"); /* * Bind a address to our socket, so that * client programs can listen to this * server: */ z = bind(s, (struct sockaddr *)&adr_srvr, len_srvr); if ( z == -1 ) bail("bind()"); /* * Broadcast the updated info: */ z = sendto(s, bcbuf, strlen(bcbuf), 0, (struct sockaddr *)&adr_bc, len_bc); /* * Now start serving quotes : */ initialize(); for (; ; ) /* * Update one quote in the list: */ gen_quote(); * Form a packet to send out : */ bp = bcbuf; for ( x=0; x<MAXQ; ++x ) I 0 = quotes[x]. start / 100. 0; I = quotes[x]. current / 100. 0; sprintf(bp, "%-7. 7 s %8. 2 f %+. 2 f", quotes[x]. index, I, I - I 0); bp += strlen(bp); if ( z == -1 ) bail("sendto()"); sleep(4); return 0; } 21 HANNAM UNIVERSITY
Server program Listing 13. 1 : stksrv. c-The Stock Market Index Broadcasting Server int main(int argc, char **argv) short x; /* index of Stock Indexes */ double I 0; /* Initial index value */ double I; /* Index value */ char bcbuf[512], *bp; /* Buffer and ptr */ int z; /* Status return code */ int s; /* Socket */ struct sockaddr_in adr_srvr; /* AF_INET */ int len_srvr; /* length */ struct sockaddr_in adr_bc; /* AF_INET */ int len_bc; /* length */ static int so_broadcast = TRUE; static char *sv_addr = "127. 0. 0. 1: *", *bc_addr = "127. 255: 9097"; /* len_bc = sizeof adr_bc; * Form the server address : */ len_srvr = sizeof adr_srvr; z = mkaddr( &adr_srvr, /* Returned address */ &len_srvr, /* Returned length */ sv_addr, /* Input string addr */ "udp"); /* UDP protocol */ */ len_bc = sizeof adr_bc; if ( z == -1 ) z = mkaddr( /* Returned address */ bail("Bad broadcast &adr_bc, address"); &len_bc, /* Returned length */ if ( argc > 1 ) /* Broadcast address : */ bc_addr = argv[1]; http: //netwk. hannam. ac. kr * Allow broadcasts : */ z = setsockopt(s, SOL_SOCKET, SO_BROADCAST, &so_broadcast, sizeof so_broadcast); /* • Broadcast address 형성 z = mkaddr( &adr_bc, /* Returned address */ &len_bc, /* Returned length */ if ( z == -1 ) server address"); bc_addr, /* Input bail("Bad string addr */ /* "udp"); /* UDP protocol */ * Form the broadcast address : /* * Form a server address : */ if ( argc > 2 ) /* Server address : */ sv_addr = argv[2]; /* bc_addr, /* Input string addr */ "udp"); /* UDP protocol */ if ( z == -1 ) bail("Bad broadcast address"); /* * Create a UDP socket to use : */ s = socket(AF_INET, SOCK_DGRAM, 0); if ( s == -1 ) bail("socket()"); if ( z == -1 ) bail("setsockopt(SO_BROADCAST)"); /* * Bind a address to our socket, so that * client programs can listen to this * server: */ z = bind(s, (struct sockaddr *)&adr_srvr, len_srvr); if ( z == -1 ) bail("bind()"); /* * Broadcast the updated info: */ z = sendto(s, bcbuf, strlen(bcbuf), 0, (struct sockaddr *)&adr_bc, len_bc); /* * Now start serving quotes : */ initialize(); for (; ; ) /* * Update one quote in the list: */ gen_quote(); * Form a packet to send out : */ bp = bcbuf; for ( x=0; x<MAXQ; ++x ) I 0 = quotes[x]. start / 100. 0; I = quotes[x]. current / 100. 0; sprintf(bp, "%-7. 7 s %8. 2 f %+. 2 f", quotes[x]. index, I, I - I 0); bp += strlen(bp); if ( z == -1 ) bail("sendto()"); sleep(4); return 0; } 22 HANNAM UNIVERSITY
Server program Listing 13. 1 : stksrv. c-The Stock Market Index Broadcasting Server int main(int argc, char **argv) short x; /* index of Stock Indexes */ double I 0; /* Initial index value */ double I; /* Index value */ char bcbuf[512], *bp; /* Buffer and ptr */ int z; /* Status return code */ int s; /* Socket */ struct sockaddr_in adr_srvr; /* AF_INET */ int len_srvr; /* length */ struct sockaddr_in adr_bc; /* AF_INET */ int len_bc; /* length */ static int so_broadcast = TRUE; static char *sv_addr = "127. 0. 0. 1: *", *bc_addr = "127. 255: 9097"; • Socket 생성 /* * Form the server address : */ len_srvr = sizeof adr_srvr; z = mkaddr( &adr_srvr, /* Returned address */ &len_srvr, /* Returned length */ sv_addr, /* Input string addr */ "udp"); /* UDP protocol */ if ( argc > 1 ) /* Broadcast address : */ bc_addr = argv[1]; http: //netwk. hannam. ac. kr * Allow broadcasts : */ z = setsockopt(s, SOL_SOCKET, SO_BROADCAST, &so_broadcast, sizeof so_broadcast); /* * Form a packet to send out : */ bp = bcbuf; for ( x=0; x<MAXQ; ++x ) I 0 = quotes[x]. start / 100. 0; I = quotes[x]. current / 100. 0; sprintf(bp, "%-7. 7 s %8. 2 f %+. 2 f", quotes[x]. index, I, I - I 0); bp += strlen(bp); s = socket(AF_INET, SOCK_DGRAM, 0); if ( s == -1 ) bail("socket()"); if ( z == -1 ) bail("setsockopt(SO_BROADCAST)"); z = setsockopt(s, /* SOL_SOCKET, /* * Bind a address to our socket, so that * Form the broadcast address : * client programs can listen to this SO_BROADCAST, */ * server: len_bc = sizeof adr_bc; */ &so_broadcast, z = bind(s, z = mkaddr( (struct sockaddr *)&adr_srvr, sizeof so_broadcast); &adr_bc, /* Returned address */ len_srvr); if ( z == -1 ) bail("Bad server address"); • SO_BROADCAST enable /* * Form a server address : */ if ( argc > 2 ) /* Server address : */ sv_addr = argv[2]; /* &len_bc, /* Returned length */ bc_addr, /* Input string addr */ "udp"); /* UDP protocol */ /* * Broadcast the updated info: */ z = sendto(s, bcbuf, strlen(bcbuf), 0, (struct sockaddr *)&adr_bc, len_bc); if ( z == -1 ) bail("bind()"); if ( z == -1 ) /* if ( z == -1 ) * Now start serving quotes : bail("setsockopt(SO_BROADCAST)"); bail("Bad broadcast address"); */ if ( z == -1 ) /* * Create a UDP socket to use : */ s = socket(AF_INET, SOCK_DGRAM, 0); if ( s == -1 ) bail("socket()"); initialize(); for (; ; ) /* * Update one quote in the list: */ gen_quote(); bail("sendto()"); sleep(4); return 0; } 23 HANNAM UNIVERSITY
Server program Listing 13. 1 : stksrv. c-The Stock Market Index Broadcasting Server int main(int argc, char **argv) short x; /* index of Stock Indexes */ double I 0; /* Initial index value */ double I; /* Index value */ char bcbuf[512], *bp; /* Buffer and ptr */ int z; /* Status return code */ int s; /* Socket */ struct sockaddr_in adr_srvr; /* AF_INET */ int len_srvr; /* length */ struct sockaddr_in adr_bc; /* AF_INET */ int len_bc; /* length */ static int so_broadcast = TRUE; static char *sv_addr = "127. 0. 0. 1: *", *bc_addr = "127. 255: 9097"; /* * Form the server address : */ len_srvr = sizeof adr_srvr; z = mkaddr( &adr_srvr, /* Returned address */ &len_srvr, /* Returned length */ sv_addr, /* Input string addr */ "udp"); /* UDP protocol */ • Server address bind /* * Form a server address : */ if ( argc > 2 ) /* Server address : */ sv_addr = argv[2]; if ( argc > 1 ) /* Broadcast address : */ bc_addr = argv[1]; http: //netwk. hannam. ac. kr if ( z == -1 ) bail("Bad server address"); /* * Form the broadcast address : */ len_bc = sizeof adr_bc; z = mkaddr( &adr_bc, /* Returned address */ &len_bc, /* Returned length */ bc_addr, /* Input string addr */ "udp"); /* UDP protocol */ if ( z == -1 ) bail("Bad broadcast address"); /* * Create a UDP socket to use : */ s = socket(AF_INET, SOCK_DGRAM, 0); if ( s == -1 ) bail("socket()"); /* * Allow broadcasts : */ z = setsockopt(s, SOL_SOCKET, SO_BROADCAST, &so_broadcast, sizeof so_broadcast); /* * Form a packet to send out : */ bp = bcbuf; for ( x=0; x<MAXQ; ++x ) I 0 = quotes[x]. start / 100. 0; I = quotes[x]. current / 100. 0; sprintf(bp, "%-7. 7 s %8. 2 f %+. 2 f", quotes[x]. index, I, I - I 0); bp += strlen(bp); z = bind(s, (struct sockaddr *)&adr_srvr, len_srvr); if ( z == -1 ) bail("setsockopt(SO_BROADCAST)"); bail("bind()"); /* * Bind a address to our socket, so that * client programs can listen to this * server: */ z = bind(s, (struct sockaddr *)&adr_srvr, len_srvr); if ( z == -1 ) bail("bind()"); /* * Broadcast the updated info: */ z = sendto(s, bcbuf, strlen(bcbuf), 0, (struct sockaddr *)&adr_bc, len_bc); /* * Now start serving quotes : */ initialize(); for (; ; ) /* * Update one quote in the list: */ gen_quote(); if ( z == -1 ) bail("sendto()"); sleep(4); return 0; } 24 HANNAM UNIVERSITY
Server program Listing 13. 1 : stksrv. c-The Stock Market Index Broadcasting Server int main(int argc, char **argv) short x; /* index of Stock Indexes */ double I 0; /* Initial index value */ double I; /* Index value */ char bcbuf[512], *bp; /* Buffer and ptr */ int z; /* Status return code */ int s; /* Socket */ struct sockaddr_in adr_srvr; /* AF_INET */ int len_srvr; /* length */ struct sockaddr_in adr_bc; /* AF_INET */ int len_bc; /* length */ static int so_broadcast = TRUE; static char *sv_addr = "127. 0. 0. 1: *", *bc_addr = "127. 255: 9097"; /* * Form the server address : */ len_srvr = sizeof adr_srvr; z = mkaddr( &adr_srvr, /* Returned address */ &len_srvr, /* Returned length */ sv_addr, /* Input string addr */ "udp"); /* UDP protocol */ • Stock market index 초기화 • Server loop 시작 if ( z == -1 ) /* * Form a server address : */ if ( argc > 2 ) /* Server address : */ sv_addr = argv[2]; if ( argc > 1 ) /* Broadcast address : */ bc_addr = argv[1]; http: //netwk. hannam. ac. kr bail("Bad server address"); /* * Form the broadcast address : */ len_bc = sizeof adr_bc; z = mkaddr( &adr_bc, /* Returned address */ &len_bc, /* Returned length */ bc_addr, /* Input string addr */ "udp"); /* UDP protocol */ if ( z == -1 ) bail("Bad broadcast address"); /* * Create a UDP socket to use : */ s = socket(AF_INET, SOCK_DGRAM, 0); if ( s == -1 ) bail("socket()"); /* * Allow broadcasts : */ z = setsockopt(s, SOL_SOCKET, SO_BROADCAST, &so_broadcast, sizeof so_broadcast); /* initialize(); for (; ; ) { if ( z == -1 ) bail("setsockopt(SO_BROADCAST)"); /* * Bind a address to our socket, so that * client programs can listen to this * server: */ z = bind(s, (struct sockaddr *)&adr_srvr, len_srvr); if ( z == -1 ) bail("bind()"); /* * Broadcast the updated info: */ z = sendto(s, bcbuf, strlen(bcbuf), 0, (struct sockaddr *)&adr_bc, len_bc); /* * Now start serving quotes : */ initialize(); for (; ; ) /* * Update one quote in the list: */ gen_quote(); * Form a packet to send out : */ bp = bcbuf; for ( x=0; x<MAXQ; ++x ) I 0 = quotes[x]. start / 100. 0; I = quotes[x]. current / 100. 0; sprintf(bp, "%-7. 7 s %8. 2 f %+. 2 f", quotes[x]. index, I, I - I 0); bp += strlen(bp); if ( z == -1 ) bail("sendto()"); sleep(4); return 0; } 25 HANNAM UNIVERSITY
Server program Listing 13. 1 : stksrv. c-The Stock Market Index Broadcasting Server int main(int argc, char **argv) short x; /* index of Stock Indexes */ double I 0; /* Initial index value */ double I; /* Index value */ char bcbuf[512], *bp; /* Buffer and ptr */ int z; /* Status return code */ int s; /* Socket */ struct sockaddr_in adr_srvr; /* AF_INET */ int len_srvr; /* length */ struct sockaddr_in adr_bc; /* AF_INET */ int len_bc; /* length */ static int so_broadcast = TRUE; static char *sv_addr = "127. 0. 0. 1: *", *bc_addr = "127. 255: 9097"; /* * Form the server address : */ len_srvr = sizeof adr_srvr; z = mkaddr( &adr_srvr, /* Returned address */ &len_srvr, /* Returned length */ sv_addr, /* Input string addr */ "udp"); /* UDP protocol */ • index를 format • buffer로 추출 /* * Form a server address : */ if ( argc > 2 ) /* Server address : */ sv_addr = argv[2]; if ( argc > 1 ) /* Broadcast address : */ bc_addr = argv[1]; http: //netwk. hannam. ac. kr if ( z == -1 ) bail("Bad server address"); /* * Form the broadcast address : */ len_bc = sizeof adr_bc; z = mkaddr( &adr_bc, /* Returned address */ &len_bc, /* Returned length */ bc_addr, /* Input string addr */ "udp"); /* UDP protocol */ if ( z == -1 ) bail("Bad broadcast address"); /* * Create a UDP socket to use : */ s = socket(AF_INET, SOCK_DGRAM, 0); if ( s == -1 ) bail("socket()"); /* * Allow broadcasts : */ z = setsockopt(s, SOL_SOCKET, SO_BROADCAST, &so_broadcast, sizeof so_broadcast); /* * Form a packet to send out : */ bp = bcbuf; for ( x=0; x<MAXQ; ++x ) I 0 = quotes[x]. start / 100. 0; I = quotes[x]. current / 100. 0; sprintf(bp, "%-7. 7 s %8. 2 f %+. 2 f", quotes[x]. index, I, I - I 0); bp += strlen(bp); bp = bcbuf; for ( x=0; x<MAXQ; ++x ) { I 0 = quotes[x]. start / 100. 0; I = quotes[x]. current / 100. 0; if ( z == -1 ) bail("setsockopt(SO_BROADCAST)"); sprintf(bp, /* "%-7. 7 s %8. 2 f %+. 2 f", * Bind a address to our socket, so that * client programs can listen to this quotes[x]. index, /* * server: */ * Broadcast the updated info: I, z = bind(s, */ (struct sockaddr *)&adr_srvr, z = sendto(s, I - I 0); len_srvr); bcbuf, if ( z == -1 ) bp += strlen(bp); strlen(bcbuf), bail("bind()"); 0, (struct sockaddr *)&adr_bc, } /* len_bc); * Now start serving quotes : */ initialize(); for (; ; ) /* * Update one quote in the list: */ gen_quote(); if ( z == -1 ) bail("sendto()"); sleep(4); return 0; } 26 HANNAM UNIVERSITY
Server program Listing 13. 1 : stksrv. c-The Stock Market Index Broadcasting Server int main(int argc, char **argv) short x; /* index of Stock Indexes */ double I 0; /* Initial index value */ double I; /* Index value */ char bcbuf[512], *bp; /* Buffer and ptr */ int z; /* Status return code */ int s; /* Socket */ struct sockaddr_in adr_srvr; /* AF_INET */ int len_srvr; /* length */ struct sockaddr_in adr_bc; /* AF_INET */ int len_bc; /* length */ static int so_broadcast = TRUE; static char *sv_addr = "127. 0. 0. 1: *", *bc_addr = "127. 255: 9097"; /* * Form the server address : */ len_srvr = sizeof adr_srvr; z = mkaddr( &adr_srvr, /* Returned address */ &len_srvr, /* Returned length */ sv_addr, /* Input string addr */ "udp"); /* UDP protocol */ • sendto( ) 호출 • broadcast if ( z == -1 ) bail("Bad server address"); • adr_bc가 broadcast address를 내포 /* * Form a server address : */ if ( argc > 2 ) /* Server address : */ sv_addr = argv[2]; if ( argc > 1 ) /* Broadcast address : */ bc_addr = argv[1]; http: //netwk. hannam. ac. kr /* * Form the broadcast address : */ len_bc = sizeof adr_bc; z = mkaddr( &adr_bc, /* Returned address */ &len_bc, /* Returned length */ bc_addr, /* Input string addr */ "udp"); /* UDP protocol */ if ( z == -1 ) bail("Bad broadcast address"); /* * Create a UDP socket to use : */ s = socket(AF_INET, SOCK_DGRAM, 0); if ( s == -1 ) bail("socket()"); /* /* * Allow broadcasts : */ z = setsockopt(s, SOL_SOCKET, SO_BROADCAST, &so_broadcast, sizeof so_broadcast); * Form a packet to send out : */ bp = bcbuf; for ( x=0; x<MAXQ; ++x ) I 0 = quotes[x]. start / 100. 0; I = quotes[x]. current / 100. 0; sprintf(bp, "%-7. 7 s %8. 2 f %+. 2 f", quotes[x]. index, I, I - I 0); bp += strlen(bp); z = sendto(s, bcbuf, if ( z == -1 ) bail("setsockopt(SO_BROADCAST)"); strlen(bcbuf), /* 0, * Bind a address to our socket, so that * client programs can listen to this (struct sockaddr *)&adr_bc, * server: /* */ * Broadcast the updated info: len_bc); z = bind(s, */ (struct sockaddr *)&adr_srvr, len_srvr); if ( z == -1 ) bail("bind()"); z = sendto(s, bcbuf, strlen(bcbuf), 0, (struct sockaddr *)&adr_bc, len_bc); if ( z == -1 ) bail("sendto()"); /* * Now start serving quotes : */ initialize(); for (; ; ) /* * Update one quote in the list: */ gen_quote(); if ( z == -1 ) bail("sendto()"); sleep(4); return 0; } 27 HANNAM UNIVERSITY
Server program Listing 13. 1 : stksrv. c-The Stock Market Index Broadcasting Server int main(int argc, char **argv) short x; /* index of Stock Indexes */ double I 0; /* Initial index value */ double I; /* Index value */ char bcbuf[512], *bp; /* Buffer and ptr */ int z; /* Status return code */ int s; /* Socket */ struct sockaddr_in adr_srvr; /* AF_INET */ int len_srvr; /* length */ struct sockaddr_in adr_bc; /* AF_INET */ int len_bc; /* length */ static int so_broadcast = TRUE; static char *sv_addr = "127. 0. 0. 1: *", *bc_addr = "127. 255: 9097"; /* * Form a server address : */ if ( argc > 2 ) /* Server address : */ sv_addr = argv[2]; /* * Form the server address : */ len_srvr = sizeof adr_srvr; z = mkaddr( &adr_srvr, /* Returned address */ &len_srvr, /* Returned length */ sv_addr, /* Input string addr */ "udp"); /* UDP protocol */ if ( z == -1 ) bail("Bad server address"); /* * Form the broadcast address : */ len_bc = sizeof adr_bc; z = mkaddr( &adr_bc, /* Returned address */ &len_bc, /* Returned length */ bc_addr, /* Input string addr */ "udp"); /* UDP protocol */ • Time delay if ( z == -1 ) • For quote update bail("Bad broadcast address"); if ( argc > 1 ) /* Broadcast address : */ bc_addr = argv[1]; http: //netwk. hannam. ac. kr /* * Create a UDP socket to use : */ s = socket(AF_INET, SOCK_DGRAM, 0); if ( s == -1 ) bail("socket()"); /* * Allow broadcasts : */ z = setsockopt(s, SOL_SOCKET, SO_BROADCAST, &so_broadcast, sizeof so_broadcast); /* if ( z == -1 ) bail("setsockopt(SO_BROADCAST)"); /* * Bind a address to our socket, so that * client programs can listen to this * server: */ z = bind(s, (struct sockaddr *)&adr_srvr, len_srvr); if ( z == -1 ) bail("bind()"); /* * Broadcast the updated info: */ z = sendto(s, bcbuf, strlen(bcbuf), 0, (struct sockaddr *)&adr_bc, len_bc); /* * Now start serving quotes : */ initialize(); if ( z == -1 ) bail("sendto()"); sleep(4); for (; ; ) /* * Update one quote in the list: */ gen_quote(); * Form a packet to send out : */ bp = bcbuf; for ( x=0; x<MAXQ; ++x ) I 0 = quotes[x]. start / 100. 0; I = quotes[x]. current / 100. 0; sprintf(bp, "%-7. 7 s %8. 2 f %+. 2 f", quotes[x]. index, I, I - I 0); bp += strlen(bp); sleep(4); return 0; } 28 HANNAM UNIVERSITY
Client program Listing 13. 2 gqoutes. c - The Stock Market Index Client Program /* gquotes. c: * * Get datagram stock market * quotes from UDP broadcast : */ #include #include #include <stdio. h> <unistd. h> <stdlib. h> <errno. h> <string. h> <time. h> <signal. h> <sys/types. h> <sys/socket. h> <netinet/in. h> <arpa/inet. h> #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif /* * This function reports the error and * exits back to the shell : */ static void bail(const char *on_what) fputs(strerror(errno), stderr); fputs(": ", stderr); fputs(on_what, stderr); fputc('', stderr); exit(1); int main(int argc, char **argv) int z; int x; struct sockaddr_in adr; /* AF_INET */ int len_inet; /* length */ int s; /* Socket */ char dgram[512]; /* Recv buffer */ static int so_reuseaddr = TRUE; static char *bc_addr = "127. 255: 9097"; extern int mkaddr( void *addr, int *addrlen, char *str_addr, char *protocol); /* * Use a server address from the command * line, if one has been provided. * Otherwise, this program will default * to using the arbitrary address * 127. 0. 0. 23 : */ if ( argc > 1 ) http: //netwk. hannam. ac. kr /* Broadcast address : */ bc_addr = argv[1]; /* * Create a UDP socket to use : */ s = socket(AF_INET, SOCK_DGRAM, 0); if ( s == -1 ) bail("socket()"); /* * Form the broadcast address : */ len_inet = sizeof adr; z = mkaddr(&adr, &len_inet, bc_addr, "udp"); if ( z == -1 ) bail("Bad broadcast address"); /* /* * Bind our socket to the broadcast address: */ z = bind(s, (struct sockaddr *)&adr, len_inet); if ( z == -1 ) bail("bind(2)"); for (; ; ) /* * Wait for a broadcast message : */ z = recvfrom(s, /* Socket */ dgram, /* Receiving buffer */ sizeof dgram, /* Max rcv buf size */ 0, /* Flags: no options */ (struct sockaddr *)&adr, /* Addr */ &x); /* Addr len, in & out */ if ( z < 0 ) • Default Broadcast address bail("recvfrom(2)"); /* else err */ * Allow multiple listeners on the • UDP port number * broadcast address : fwrite(dgram, z, 1, stdout); */ z = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &so_reuseaddr, sizeof so_reuseaddr); if ( z == -1 ) bail("setsockopt(SO_REUSEADDR)"); putchar(''); fflush(stdout); return 0; 29 HANNAM UNIVERSITY
Client program Listing 13. 2 gqoutes. c - The Stock Market Index Client Program /* gquotes. c: * * Get datagram stock market * quotes from UDP broadcast : */ /* * This function reports the error and * exits back to the shell : */ static void bail(const char *on_what) fputs(strerror(errno), stderr); fputs(": ", stderr); fputs(on_what, stderr); fputc('', stderr); exit(1); • UDB Socket 생성 #include #include #include <stdio. h> <unistd. h> <stdlib. h> <errno. h> <string. h> <time. h> <signal. h> <sys/types. h> <sys/socket. h> <netinet/in. h> <arpa/inet. h> int main(int argc, char **argv) • Broadcast address 형성 #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif extern int mkaddr( void *addr, int *addrlen, char *str_addr, char *protocol); int z; int x; struct sockaddr_in adr; /* AF_INET */ int len_inet; /* length */ int s; /* Socket */ char dgram[512]; /* Recv buffer */ static int so_reuseaddr = TRUE; static char *bc_addr = "127. 255: 9097"; /* * Use a server address from the command * line, if one has been provided. * Otherwise, this program will default * to using the arbitrary address * 127. 0. 0. 23 : */ if ( argc > 1 ) http: //netwk. hannam. ac. kr /* Broadcast address : */ bc_addr = argv[1]; /* * Create a UDP socket to use : */ s = socket(AF_INET, SOCK_DGRAM, 0); if ( s == -1 ) bail("socket()"); /* * Bind our socket to the broadcast address: */ z = bind(s, (struct sockaddr *)&adr, len_inet); s = socket(AF_INET, SOCK_DGRAM, 0); if ( s == -1 ) bail("socket()"); /* * Form the broadcast address : */ len_inet = sizeof adr; if ( z == -1 ) bail("bind(2)"); for (; ; ) /* * Wait for a broadcast message : */ z = recvfrom(s, /* Socket */ dgram, /* Receiving buffer */ sizeof dgram, /* Max rcv buf size */ 0, /* Flags: no options */ (struct sockaddr *)&adr, /* Addr */ &x); /* Addr len, in & out */ len_inet = sizeof adr; z = mkaddr(&adr, &len_inet, bc_addr, "udp"); z = mkaddr(&adr, if ( z == -1 ) &len_inet, bail("Bad broadcast address"); if ( z < 0 ) bc_addr, /* bail("recvfrom(2)"); /* else err */ * Allow multiple listeners on the * broadcast address : fwrite(dgram, z, 1, stdout); "udp"); */ putchar(''); z = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &so_reuseaddr, sizeof so_reuseaddr); fflush(stdout); if ( z == -1 ) return 0; bail("Bad broadcast address"); if ( z == -1 ) bail("setsockopt(SO_REUSEADDR)"); 30 HANNAM UNIVERSITY
Client program Listing 13. 2 gqoutes. c - The Stock Market Index Client Program /* gquotes. c: * * Get datagram stock market * quotes from UDP broadcast : */ #include #include #include <stdio. h> <unistd. h> <stdlib. h> <errno. h> <string. h> <time. h> <signal. h> <sys/types. h> <sys/socket. h> <netinet/in. h> <arpa/inet. h> /* * This function reports the error and * exits back to the shell : */ static void bail(const char *on_what) fputs(strerror(errno), stderr); fputs(": ", stderr); fputs(on_what, stderr); fputc('', stderr); exit(1); int main(int argc, char **argv) int z; int x; struct sockaddr_in adr; /* AF_INET */ int len_inet; /* length */ int s; /* Socket */ char dgram[512]; /* Recv buffer */ static int so_reuseaddr = TRUE; static char *bc_addr = "127. 255: 9097"; • SO_REUSEADDR enable #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif extern int mkaddr( void *addr, int *addrlen, char *str_addr, char *protocol); /* * Use a server address from the command * line, if one has been provided. * Otherwise, this program will default * to using the arbitrary address * 127. 0. 0. 23 : */ if ( argc > 1 ) http: //netwk. hannam. ac. kr /* Broadcast address : */ bc_addr = argv[1]; /* * Create a UDP socket to use : */ s = socket(AF_INET, SOCK_DGRAM, 0); if ( s == -1 ) bail("socket()"); /* * Form the broadcast address : */ len_inet = sizeof adr; z = mkaddr(&adr, &len_inet, bc_addr, "udp"); /* * Bind our socket to the broadcast address: */ z = bind(s, (struct sockaddr *)&adr, len_inet); if ( z == -1 ) bail("bind(2)"); for (; ; ) /* * Wait for a broadcast message : */ z = recvfrom(s, /* Socket */ dgram, /* Receiving buffer */ sizeof dgram, /* Max rcv buf size */ 0, /* Flags: no options */ (struct sockaddr *)&adr, /* Addr */ &x); /* Addr len, in & out */ z = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, if ( z == -1 ) bail("Bad broadcast address"); &so_reuseaddr, if ( z < 0 ) /* bail("recvfrom(2)"); /* else err */ so_reuseaddr); * Allow multiplesizeof listeners on the * broadcast address : */ z = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &so_reuseaddr, sizeof so_reuseaddr); fwrite(dgram, z, 1, stdout); putchar(''); if ( z == -1 ) fflush(stdout); bail("setsockopt(SO_REUSEADDR)"); if ( z == -1 ) bail("setsockopt(SO_REUSEADDR)"); return 0; 31 HANNAM UNIVERSITY
Client program Listing 13. 2 gqoutes. c - The Stock Market Index Client Program /* gquotes. c: * * Get datagram stock market * quotes from UDP broadcast : */ /* * This function reports the error and * exits back to the shell : */ static void bail(const char *on_what) fputs(strerror(errno), stderr); fputs(": ", stderr); fputs(on_what, stderr); fputc('', stderr); exit(1); • Broadcast address bind #include #include #include <stdio. h> <unistd. h> <stdlib. h> <errno. h> <string. h> <time. h> <signal. h> <sys/types. h> <sys/socket. h> <netinet/in. h> <arpa/inet. h> int main(int argc, char **argv) int z; int x; struct sockaddr_in adr; /* AF_INET */ int len_inet; /* length */ int s; /* Socket */ char dgram[512]; /* Recv buffer */ static int so_reuseaddr = TRUE; static char *bc_addr = "127. 255: 9097"; • Broadcast 수신 loop 시작 #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif extern int mkaddr( void *addr, int *addrlen, char *str_addr, char *protocol); /* * Use a server address from the command * line, if one has been provided. * Otherwise, this program will default * to using the arbitrary address * 127. 0. 0. 23 : */ if ( argc > 1 ) http: //netwk. hannam. ac. kr /* Broadcast address : */ bc_addr = argv[1]; /* * Create a UDP socket to use : */ s = socket(AF_INET, SOCK_DGRAM, 0); if ( s == -1 ) bail("socket()"); /* * Bind our socket to the broadcast address: */ z = bind(s, (struct sockaddr *)&adr, len_inet); if ( z == -1 ) /* * Form the broadcast address : */ len_inet = sizeof adr; bail("bind(2)"); if ( z == -1 ) for/*(; ; ) bail("bind(2)"); **/Wait for a broadcast message : z = mkaddr(&adr, &len_inet, bc_addr, "udp"); for (; ; ) { if ( z == -1 ) bail("Bad broadcast address"); /* * Allow multiple listeners on the * broadcast address : */ z = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &so_reuseaddr, sizeof so_reuseaddr); if ( z == -1 ) bail("setsockopt(SO_REUSEADDR)"); z = recvfrom(s, /* Socket */ dgram, /* Receiving buffer */ sizeof dgram, /* Max rcv buf size */ 0, /* Flags: no options */ (struct sockaddr *)&adr, /* Addr */ &x); /* Addr len, in & out */ if ( z < 0 ) bail("recvfrom(2)"); /* else err */ fwrite(dgram, z, 1, stdout); putchar(''); fflush(stdout); return 0; 32 HANNAM UNIVERSITY
Client program Listing 13. 2 gqoutes. c - The Stock Market Index Client Program /* gquotes. c: * * Get datagram stock market * quotes from UDP broadcast : */ /* * This function reports the error and * exits back to the shell : */ static void bail(const char *on_what) fputs(strerror(errno), stderr); fputs(": ", stderr); fputs(on_what, stderr); fputc('', stderr); exit(1); • Broadcast 수신 #include #include #include <stdio. h> <unistd. h> <stdlib. h> <errno. h> <string. h> <time. h> <signal. h> <sys/types. h> <sys/socket. h> <netinet/in. h> <arpa/inet. h> #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif extern int mkaddr( void *addr, int *addrlen, char *str_addr, char *protocol); int main(int argc, char **argv) int z; int x; struct sockaddr_in adr; /* AF_INET */ int len_inet; /* length */ int s; /* Socket */ char dgram[512]; /* Recv buffer */ static int so_reuseaddr = TRUE; static char *bc_addr = "127. 255: 9097"; /* * Use a server address from the command * line, if one has been provided. * Otherwise, this program will default * to using the arbitrary address * 127. 0. 0. 23 : */ if ( argc > 1 ) http: //netwk. hannam. ac. kr /* Broadcast address : */ bc_addr = argv[1]; /* * Create a UDP socket to use : */ s = socket(AF_INET, SOCK_DGRAM, 0); if ( s == -1 ) bail("socket()"); /* * Bind our socket to the broadcast address: */ z = bind(s, (struct sockaddr *)&adr, len_inet); z = recvfrom(s, /* Socket */ dgram, /* Receiving buffer */ if ( z == -1 ) sizeof dgram, /* Max rcv buf size */ bail("bind(2)"); /* 0, /* Flags: forno options */ * Form the broadcast address : (; ; ) */ /* (struct sockaddr *)&adr, /* Addr */ len_inet = sizeof adr; * Wait for a broadcast message : */ &x); /* Addr len, in & out/* Socket */ */ z = mkaddr(&adr, z = recvfrom(s, &len_inet, bc_addr, "udp"); dgram, /* Receiving buffer */ sizeof dgram, /* Max rcv buf size */ 0, /* Flags: no options */ (struct sockaddr *)&adr, /* Addr */ &x); /* Addr len, in & out */ if if(( zz==< 0) -1 ) bail("Bad broadcast address"); bail("recvfrom(2)"); if ( /* else err */ z<0) /* * Allow multiple listeners on the * broadcast address : */ z = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &so_reuseaddr, sizeof so_reuseaddr); if ( z == -1 ) bail("setsockopt(SO_REUSEADDR)"); bail("recvfrom(2)"); /* else err */ fwrite(dgram, z, 1, stdout); putchar(''); fflush(stdout); return 0; 33 HANNAM UNIVERSITY
Client program Listing 13. 2 gqoutes. c - The Stock Market Index Client Program /* gquotes. c: * * Get datagram stock market * quotes from UDP broadcast : */ /* * This function reports the error and * exits back to the shell : */ static void bail(const char *on_what) fputs(strerror(errno), stderr); fputs(": ", stderr); fputs(on_what, stderr); fputc('', stderr); exit(1); • standard output #include #include #include <stdio. h> <unistd. h> <stdlib. h> <errno. h> <string. h> <time. h> <signal. h> <sys/types. h> <sys/socket. h> <netinet/in. h> <arpa/inet. h> #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif extern int mkaddr( void *addr, int *addrlen, char *str_addr, char *protocol); int main(int argc, char **argv) int z; int x; struct sockaddr_in adr; /* AF_INET */ int len_inet; /* length */ int s; /* Socket */ char dgram[512]; /* Recv buffer */ static int so_reuseaddr = TRUE; static char *bc_addr = "127. 255: 9097"; /* * Use a server address from the command * line, if one has been provided. * Otherwise, this program will default * to using the arbitrary address * 127. 0. 0. 23 : */ if ( argc > 1 ) http: //netwk. hannam. ac. kr /* Broadcast address : */ bc_addr = argv[1]; /* * Create a UDP socket to use : */ s = socket(AF_INET, SOCK_DGRAM, 0); if ( s == -1 ) bail("socket()"); /* * Bind our socket to the broadcast address: */ z = bind(s, (struct sockaddr *)&adr, len_inet); fwrite(dgram, z, 1, stdout); putchar(''); if ( z == -1 ) bail("bind(2)"); fflush(stdout); /* * Form the broadcast address : */ len_inet = sizeof adr; z = mkaddr(&adr, &len_inet, bc_addr, "udp"); if ( z == -1 ) bail("Bad broadcast address"); /* * Allow multiple listeners on the * broadcast address : */ z = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &so_reuseaddr, sizeof so_reuseaddr); if ( z == -1 ) bail("setsockopt(SO_REUSEADDR)"); for (; ; ) /* * Wait for a broadcast message : */ z = recvfrom(s, /* Socket */ dgram, /* Receiving buffer */ sizeof dgram, /* Max rcv buf size */ 0, /* Flags: no options */ (struct sockaddr *)&adr, /* Addr */ &x); /* Addr len, in & out */ if ( z < 0 ) bail("recvfrom(2)"); /* else err */ fwrite(dgram, z, 1, stdout); putchar(''); fflush(stdout); return 0; 34 HANNAM UNIVERSITY
Demo. < $. /stksrv 127. 255: 9097 & < $. /gquotes 127. 255: 9097 < $. /stksrv 192. 168. 0. 255: 9097 ‘ 192. 168. 0. 1: *’ & < $. /gqoutes 192. 168. 0. 255 (pepper) < $. /gqoutes 192. 168. 0. 255 (slug) http: //netwk. hannam. ac. kr 35 HANNAM UNIVERSITY
Troubleshooting < Hub 탐색 Ü packet traffic 표시 LED flicker 확인 < tcpdump command 사용 @slug # tcpdump udp port 9097 tcpdump: listening on eth 0 21: 04: 43, 967482 pepper. ve 3 wwg. or. 1032 > 192. 168. 0. 255. 9097: udp 96 21: 04: 47, 977482 pepper. ve 3 wwg. or. 1032 > 192. 168. 0. 255. 9097: udp 96 21: 04: 51, 987482 pepper. ve 3 wwg. or. 1032 > 192. 168. 0. 255. 9097: udp 96 http: //netwk. hannam. ac. kr 36 HANNAM UNIVERSITY
요약 http: //netwk. hannam. ac. kr 37 HANNAM UNIVERSITY
- Slides: 37