2016-10-17 63 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