- 论坛徽章:
- 0
|
正在学习Linux Socket ,用的是《Linux Socket Programming》这本书。里面有一段UDP广播的程序
如下:
/*服务器程序,用来发送广播包,模拟股市信息*/
#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>
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif
/*mkaddr()函数把一个字符串的IP地址,转换为AF_INET,经测试mkaddr函数正确*/
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",128331,125},
{"S&P 500",276175,125},
{"TSE 300",689572,75},
};
/*初始化函数*/
static void initialize(void)
{
short x;
time_t td;
/*Seed the random number generator*/
time(&td);
srand((int)td);
for(x = 0;x<MAXQ;++x)
{
quotes[x].current =quotes[x].start;
}
}
/*随即的改变股票指数*/
static void gen_quote(void)
{
short x; /*Index*/
short v; /*Volatility of index*/
short h; /*half of v*/
short r; /*changed randomly*/
x = rand()%MAXQ;
v =quotes[x].volit;
h = (v/2) - 2;
r = rand()%v;
if(r < h)
{
r = -r;
}
quotes[x].current += r;
}
/*F用来报错的函数 */
static void fail(const char *on_what)
{
if(errno > 0)
{
fputs(strerror(errno),stderr);
fputs(":",stderr);
}
fputs(on_what,stderr);
fputc('\n',stderr);
exit(1);
}
int main(int argc,char *argv[])
{
short x; /*Index of Stock index*/
double I0; /*Initial index value*/
double I; /*Index value */
char bcbuf[512],*bp; /*buffer and index*/
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:*";
static char *bc_addr = "127.255.255.255:9097";
/*从命令行得到IP地址*/
if( argc > 2)
{
/*Server address*/
sv_addr = argv[2];
}
if(argc>1)
{
/*Broadcast address*/
bc_addr = argv[1];
}
/*用程序构造服务器地址*/
len_srvr = sizeof(adr_srvr);
z = mkaddr(&adr_srvr,&len_srvr,sv_addr,"udp");
if(z == -1)
{
fail("Bad server address!");
}
/*创建UDP 套接字*/
s = socket(AF_INET,SOCK_DGRAM,0);
if(s == -1)
{
fail("socket()");
}
/*允许广播*/
z = setsockopt(s,SOL_SOCKET,SO_BROADCAST,&so_broadcast,sizeof(so_broadcast));
if(z == -1)
{
fail("setsockopt(SO_BROADCAST)");
}
z = bind(s,(struct sockaddr *)&adr_srvr,len_srvr);
if(z == -1)
{
fail("bind()");
}
/*启动报价服务*/
initialize();
len_bc = sizeof(adr_bc);
while(1)
{
gen_quote();
bp = bcbuf;
for(x=0;x<MAXQ;x++)
{
I0 =quotes[x].start / 100.0;
I =quotes[x].current / 100.0;
sprintf(bp,"%-7.7s %8.2f %+.2f\n",quotes[x].index,I,I-I0);
bp += strlen(bp);
}
z = sendto(s,bcbuf,strlen(bcbuf),0,(struct sockaddr *)&adr_bc,len_bc);
if(z == -1)
{
fail("sendto()");
}
sleep(4);
}
return 0;
} |
|