在实际的网络应用中,只实现两点之间的的通讯是远远不够的。广播是能够同时实现多点通信的一种模式,这种通讯模式可以同时将信息发布到许多接收端点。

用于广播地址的约定是将IP所有的主机位都设置为1。例如127.255.255.255、192.168.0.255等。

下面是一段服务器的代码,它的作用是每隔4秒广播一次当前时间:

?[Copy to clipboard]View Code C
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
/* srv.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> /* * 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('\n',stderr);    exit(1);} intmain(int argc,char **argv) {    time_t td;    int n;    char buf[128];    int z;           /* Status return code */    int s;                       /* Socket */    struct sockaddr_in addr_srv;/* AF_INET */    int len_srv;               /* length  */    struct sockaddr_in addr_bc;  /* AF_INET */    int len_bc;                 /* length  */    static int so_broadcast = 1;    len_srv = sizeof (addr_srv);    len_bc = sizeof (addr_bc);     memset(&addr_srv,0,len_srv);    addr_srv.sin_port=0;    addr_srv.sin_family=AF_INET;    addr_srv.sin_addr.s_addr=inet_addr("127.0.0.1");     memset(&addr_bc,0,len_bc);    addr_bc.sin_port=htons(9999);    addr_bc.sin_family=AF_INET;    addr_bc.sin_addr.s_addr=inet_addr("127.255.255.255");     /*     * 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 *)&addr_srv,        len_srv);    if ( z == -1 )        bail("bind()");     for (;;) {            time(&td);            strftime(buf,sizeof(buf)," %Y %b %d %H:%M:%S  \n",localtime(&td));            printf("%s\n",buf);             z = sendto(s,            buf,            strlen(buf),            0,            (struct sockaddr *)&addr_bc,            len_bc);            if ( z == -1 )                bail("sendto()");         sleep(4);    }    return 0;}