滑动窗口协议的数据转换,C

时间:2012-03-22 11:24:42

标签: c sockets data-conversion sliding-window

我所遇到的问题非常具体。

我必须通过链接在C中实现滑动窗口协议。我的sender.c文件接收丢失或损坏文件的速度,延迟和百分比作为参数。数据通过链接发送。由于这是一个学校作业,我不知道链接的实现细节,但是,发送者和接收者必须使用端口和ip初始化链接,我猜他们正在使用套接字。无论如何,我正在尝试向连接器发送连接参数,以便将它们用于超时和控制流程。我创建了数据帧有效负载,使用以下命令发送表示速度和延迟的2个整数:

int s = (int)(*speed - '0'); int d = (int)(*delay - '0'); sprintf(t.payload,"%d%d",s,d);

当我在发件人文件中打印s和d变量时,结果为1,1这是正确的。之后我将结果的payloar发送给接收者,其中payload [0]被分配给另一个名为speed的int变量,而payload [1]被分配给另一个名为delay的int。问题是,他们在这里的价值是49而不是他们应该的。我尝试在它们上使用atoi()函数但是当我这样做时,延迟被成功转换为1,而速度转换为11,这没有任何意义。我已经尝试了很多不同的方法来使它工作,将它们作为字符发送并在接收端转换它们也没有帮助。

有什么想法吗?

PS:抱歉这个巨大的帖子和我的英语错误!

1 个答案:

答案 0 :(得分:1)

我假设't'是结构变量,有效负载是字符数组。您将两个数字作为char数组发送。它不可能在没有某种欺骗的情况下将它们从char *转换回整数。例如,如果您的有效负载是“12345”,那么如何提取您从其他人发送的两个正确的数字?所有你知道的是“12345”是2个数字的串联。它可以是(1,2345)或(12,345)或(1234,5)......等等。

我建议你两次运行send命令并相应地接收。 像:

char str[10]; //a temporary variable

sprint(str,"%d", speed);
send (.......); //receive just delay alone on the other side

sprint(str,"%d", delay);
send(........);

替代方法可以是在提取数字时插入字符作为标识符并使​​用tokenize(strtok)。像:

sprint(t.payload, "%dZ%d",speed, delay); //sender side
/* Here 'Z' is used as a delimiter */

在接收方:

char *tok, *str;

receive(str, ....);

tok=strtok(str,"Z");
speed = atoi(tok);
tok=strtok(NULL);
delay=atoi(tok); 

如果您发送的号码超过2个,则需要相应地处理“Z”并插入“Z”。