我在尝试传入和解析数据时遇到问题。 具体来说,我需要通过 UDP 发送 ([Unsigned Char] [String of any Length])。服务器应该能够解析此信息。不幸的是,使用 sscanf 我没有运气。请帮忙!
客户端代码:
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)
最佳答案
在服务器端的源代码中,我检测到两个错误:
1-因为第一个参数是二进制编码的(unisgned char),所以 print("%u"..) 正在工作,但等待十进制值字符串的 sscanf(.."%u"..) 不起作用编码。您无法使用 sscanf 读取此值,而只需使用:
test = (unsigned char)(buff[0]);
2- 在 sscanf 函数中,“%s”说明符等待 (char *)。您可能必须使用 strFirst 而不是 &strFirst。
sscanf(&(buff[2]), "%s", strFirst);
If you have to use only data string-encoding, you could simplify and enhance the client side by using the magic 'sprintf' function.
在客户端,源代码可能是:
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);
就这些了!!!
关于c - C 中的 UDP 字符串解析问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40079375/