📄 mdist.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 ∅ if (mdbuf[seq-mdhead.base]->siz==0) return ∅ return mdbuf[seq-mdhead.base];}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -