2016-10-17 56 views
0

我遇到了試圖傳入和解析數據的問題。 具體來說,我需要通過UDP發送([Unsigned Char] [任意長度的字符串])。服務器應該能夠解析這些信息。不幸的是,使用sscanf我沒有運氣。請幫忙!C中的UDP字符串解析問題

客戶端代碼:

char sendline[1000]; 
sendline[0] = (unsigned char)atoi(argv[3]); // Place Number at start of Buffer 
sendline[1] = (' '); // Padding For Parsing 
memcpy(&sendline[2], argv[4], sizeof(argv[4])); // Write String into Buffer after space 

result = sendto(sockfd,&sendline,(sizeof(sendline)),0,(struct sockaddr *)&servaddr,sizeof(servaddr)); 

服務器代碼:

unsigned char test; 
char strFirst [500]; 
char buff[1000]; 
len = sizeof(cliaddr); 
n = recvfrom(sockfd, buff, sizeof(buff), 0, (struct sockaddr *)&cliaddr, &len); 
buff[n] = '\0'; // Null Terminate 
printf("%u %s\n", buff[0], &buff[2]); // Prints Fine 
sscanf(buff, "%u %s", &test, &strFirst); // Attempted Parse of Data 
printf("%u \n %s \n", test, strFirst);// Prints 0 and (null) 
+0

這可能是因爲'sscanf()'不是該作業的合適工具。無論數據是6位還是10位,爲什麼發送1000個字節?你濫用'sizeof(argv [4])';你可能是指'strlen(argv [4])'。因爲你沒有正確地發送數據,你的接收器沒有機會,是嗎?或者,也許,您作爲代碼顯示的內容並不是您真正用作代碼的內容。 –

+0

我還沒有測試,但可能指針的問題? so .. sscanf(buff,「%u%s」,&test,strFirst)? 嘗試使用gdb進行調試將是一個好主意。 – Sean83

+0

我很欣賞你們倆的反饋。我在我的手機上,因此格式化可能會關閉。但Jonathan,你應該是strlen()而不是sizeof(),但我只是用它來測試。正如其他用戶發佈的,事實證明,我不應該按照你的建議使用sscanf()。所以謝謝! –

回答

1

。在服務器端源代碼,我發現了兩個錯誤:

1,因爲第一個參數是二進制編碼(unisgned char)時,print(「%u」)正在工作,但不是sscanf(..「%u」..),它等待編碼的十進制值字符串。你不能用sscanf會讀取此值,但是簡單地使用:

test = (unsigned char)(buff[0]); 

2-在sscanf函數,對「%s」符等待(字符*)。它可以你必須使用strFirst而不是& strFirst。

sscanf(&(buff[2]), "%s", strFirst); 

如果你必須使用字符串編碼唯一的數據,你可以簡化和 使用魔法「的sprintf」功能增強了客戶端。

在客戶端,源代碼可能是:

char sendline[1000]; 
int result; 

sprintf(sendline,"%u %s",atoi(argv[3]),argv[4]); 
result = sendto(sockfd,sendline,(strlen(sendline)+1),0,(struct sockaddr *)&servaddr,sizeof(servaddr)); 

在服務器端,源代碼可能是:

char buff[1000]; 
char *strFirst; 
int len,nRead,nLen; 

len = sizeof(cliaddr); 
nRead = recvfrom(sockfd, buff, sizeof(buff), 0, (struct sockaddr *)&cliaddr, &len); 
buff[nRead] = '\0'; // optional due to nRead = strlen(sendline)+1 
sscanf(buff, "%u %s", &nLen, strFirst); 

這就是所有!

+0

太棒了!我們給出了使用sscanf的提示,我想我誤解了手冊頁中的格式說明符。感謝您的幫助和簡單易懂的格式! –

+0

@CSStudent如果它解決了你的問題,你應該[接受這個答案](http://stackoverflow.com/help/accepted-answer)。 – dbush