2012-03-22 71 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的和插入的相應。