⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mdist.c

📁 一个C编写网络广播的程序
💻 C
字号:
/* mdist.c -- core buffer-ring functions, client/server *   * This file is part of 'netcast' program, released under BSD License.  * (c) 2001-2002 Stanis砤w Pa秌o <staszek@nutki.com>. All rights reserved.    */#include <stdlib.h>#include "mdist.h"struct mdmsg *mdbuf[ROUND];struct mdctl mdhead;struct mdinit mdini;struct mdmsg empty;//! initialize buffer ring.void md_init() {  int i;    for (i=0;i<ROUND;i++) {    mdbuf[i]=(struct mdmsg *) malloc(MMSIZE+4);    mdbuf[i]->siz=0;    mdbuf[i]->seq=0;   }  mdhead.blk=0;  mdhead.base=0;  mdhead.pkt=0;  empty.siz=0;}//! calculate buffer checksumuint32_t md_sum(uint8_t *data,int len) {  uint32_t *item,sum=0;  int i=0;  while (len%4) { data[len]=0; len++; }  while (i<len) {    item=(uint32_t *) ((char *)data+i);    sum+=*item;    i+=4;  }  return sum;} //! fill buffers from file descriptorlong md_fill(int fd) {  int s=0,r=MMDSIZ;   mdhead.blk++;  mdhead.base+=mdhead.pkt;  mdhead.siz=0;  while (r>0 && s<ROUND) {    if ((r=read(fd,mdbuf[s]->data,MMDSIZ))<0)       MSG(1,"Error reading data");    if (r>0) {      mdhead.siz+=r;      mdbuf[s]->siz=r;      mdbuf[s]->seq=mdhead.base+s;      mdbuf[s]->crc=md_sum(mdbuf[s]->data,r);      s++;    }      }   MSG(6,"input %d bytes of data in %d packets",mdhead.siz,s);  mdhead.pkt=s;  return s;}//! flush data to file descriptor long md_flush(int fd) {  int s=0;  while (mdhead.pkt--) {    write(fd,mdbuf[s]->data,mdbuf[s]->siz);    mdhead.siz-=mdbuf[s]->siz;    mdbuf[s]->siz=0;    mdbuf[s]->seq=0;    mdbuf[s]->crc=0;    s++;  }  return s;}//! returns previous buffer cell - used by the reader for no-copy operation struct mdmsg *md_put(struct mdmsg *src) {  struct mdmsg *tmp;  uint32_t i;  if (src->seq<mdhead.base || src->seq-mdhead.base>=mdhead.pkt) return 0;  if (src->siz == 0) return 0;  i = md_sum(src->data,src->siz);  /* refuse packets with wrong checksum */  if (src->crc != i) return 0;  i = src->seq-mdhead.base;  tmp = mdbuf[i];  mdbuf[i] = src;  return tmp;}//! get some data [retransmission ->> tcp server]struct mdmsg *md_get(uint32_t seq) {  empty.seq=seq;  if (seq<mdhead.base || seq-mdhead.base>=mdhead.pkt) return &empty;  if (mdbuf[seq-mdhead.base]->siz==0) return &empty;  return mdbuf[seq-mdhead.base];}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -