2016-10-17 10 views
0

データの受け渡しや解析に問題があります。 特に、私は([符号なし文字] [任意の長さの文字列])をUDP経由で送る必要があります。サーバーはこの情報を解析できるはずです。残念ながら、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)); 

サーバコード:最初の引数は、バイナリエンコードされているので、

の1-:サーバー側のソースコードで

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

私はあなたからのフィードバックに感謝します。私は自分の携帯電話に書いているので、フォーマットが外れている可能性があります。しかし、ジョナサン、あなたはsizeof()ではなくstrlen()でなければならないという事実は正しいですが、私はテストのためにこれを使っていました。そして、他のユーザーが投稿したとき、あなたが提案したようにsscanf()を使用すべきではないことが判明しました。ありがとう! –

答えて

1

、私は2つのエラーを検出(unisgned char)、print( "%u" ..)は動作していますが、エンコードされた10進値の文字列を待つ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を使うヒントを与えられました。私はmanページの書式指定子を誤解していたと思います。助けてくれてありがとう、フォーマットを理解しやすい! –

+0

@CSStudentあなたの問題を解決した場合は、[この回答を受け入れてください](http://stackoverflow.com/help/accepted-answer)する必要があります。 – dbush