2012-03-22 70 views
0

我拥有的问题在某种程度上非常具体。通过滑动窗口协议进行数据转换,C

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

任何想法?

PS:对于巨大的文章和我的英文错误感到抱歉!

+0

你能告诉我们代码,你到目前为止尝试过了什么(尽可能剥离,但尽可能多地理解数据类型和控制流)? – 2012-03-22 11:51:14

回答

1

我假设't'是结构变量,有效载荷是一个字符数组。你发送两个数字作为字符数组。它不可能将它们从char *转换回整数,而没有任何欺骗。例如,如果您的有效载荷是“12345”,那么如何提取您从其他人发送的两个正确号码?你所知道的是“12345”是2个数字的连接。它可能是(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个号码,你照顾“Z”的strtok的和插入的相应。