SLIP驱动程序 C语言实现

SLIP驱动程序

下面的C语言函数发送并接收SLIP分组。它们依赖于send_char() 和 recv_char(),这两个函数在串行线路上发送和接收单个字符。

/* SLIP 特殊字符编码 */
#define END 0300 /* 分组结束标记 */
#define ESC 0333 /* 填充字节标记*/
#define ESC_END 0334 /* ESC ESC_END 表示数据字节END */
#define ESC_ESC 0335 /* ESC ESC_ESC 表示数据字节ESC */

/* SEND_PACKET: 发送长“len”的分组,起始位置为“p” */
void send_packet(p, len)
char *p;
int len; {

/* 发送一个初始END 字符,清除由于线路噪声可能堆积在接收方的任何数据 */
send_char(END);

/* 为分组中的每个字符发送适当的字符序列 */
while(len--) {
switch(*p) {
/* 如果与END字符相同,我们就发送
* 两个特殊字符码避免接受方认为
* 我们发出了END结束标记
*/
case END:
send_char(ESC);
send_char(ESC_END);
break;

/* 如果与ESC字符编码相同,
* 我们就发送两个特殊字符码
* 避免接受方以为我们发送了ESC
*/
case ESC:
send_char(ESC);
send_char(ESC_ESC);
break;

/* 否则,我们就发送字符本身
*/
default:
send_char(*p);
}

p++;
}

/* 告诉接收方我们已经完成分组的发送
*/
send_char(END);
}

/* RECV_PACKET: 接收分组并放入地址为“p”的缓冲区,
* 如果收到的字节数大于len,分组将被截断
* 返回保存在缓冲区的字节数
*/
int recv_packet(p, len)
char *p;
int len; {
char c;
int received = 0;

/* 使用循环读取字节直到接受完整个分组
* 如果用完缓冲区就不再复制
*/
while(1) {
/* 取一个字符进行处理
*/
c = recv_char();

/* 如果需要则处理填充字符
*/
switch(c) {

/* 如果是END字符就表示分组完成
*/
case END:
/* 一点小小的改进:如果分组没有数据则忽略掉。
*这意味着避免双END字符构成的空分组打扰IP,
*这种空分组用于检测线路噪声。
*/
if(received)
return received;
else
break;

/* 如果收到ESC字符,则等待
* 下一个字符来决定把什么字符存入分组
*/
case ESC:
c = recv_char();

/* 如果“c”不是这两个字符中的一个,
* 就违反了协议。最好的办法似乎是 
* 单独保留这个字符并填入分组 
*/
switch(c) {
case ESC_END:
c = END;
break;
case ESC_ESC:
c = ESC;
break;
}

/* 现在到了缺省处理情况,就让它保存字符
*/
default:
if(received < len)
p[received++] = c;
}
}
}

你可能感兴趣的:(c,语言)