0

我遇到的问题在某种程度上非常具体。

我必须通过链接在 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 发送给接收方,其中有效载荷 [0] 分配给另一个称为速度的 int 变量,有效载荷 [1] 分配给另一个称为延迟的 int 变量。问题是这里它们的值是 49 而不是它们应该的值。我尝试在它们上使用 atoi() 函数,但是当我这样做时,延迟成功转换为 1,而速度转换为 11,这没有任何意义。我尝试了很多不同的方法来使其工作,将它们作为字符发送并在接收端转换它们也没有帮助。

有任何想法吗?

PS:对于巨大的帖子和我的英语错误感到抱歉!

4

1 回答 1

1

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

我建议您运行两次发送命令并相应地接收。像:

char str[10]; //a temporary variable

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

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

另一种方法是在提取数字时插入一个字符作为标识符并标记化(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 个,您需要处理 strtok 并相应地插入“Z”。

于 2012-03-22T12:00:20.230 回答