【发布时间】:2017-09-01 10:05:18
【问题描述】:
大家好,我正在尝试创建一个服务器,该服务器将接收如下消息:“str1\0str2\0str3\0”,然后在子字符串中分开。在客户端,一切似乎都正常,但是当我在服务器端收到消息时,我只收到“str1”。任何帮助将不胜感激!
服务器:
bzero(buffer,256);
n = read( newsockfd,buffer, 255 );
if (n < 0) {
perror("ERROR reading from socket");
exit(1);
}
printf("Here is the message: %s\n",buffer);
for(int i = 0; i < strlen(buffer); i++){
printf("%c", buffer[i],i);
if ( buffer[i] == 0 ){
printf("0");
}
}`
客户:
char buffer[256];
int length =0;
char *uptr = buffer;
int i;
strcpy(uptr,argv[3]);
length = length + strlen(argv[3])-3;
for ( i = 4 ; i < argc ; i++){
memcpy(uptr+length+i, argv[i] ,strlen(argv[i]) +1);
length = length + strlen(argv[i]);
}
buffer[length + (argc - 1)]= 0;
for(i = 0; i < length + argc; i++){
printf("%c", buffer[i],i);
}
【问题讨论】:
-
你怎么知道你只收到“str1”?如果你 printf 输出 'n' 你会得到什么?
-
\0标记 C 中字符串的结尾,您可能收到了所有数据,但打印函数假定字符串已结束。 -
.. 此外,这很有可能,(尽管不太可能)。由于 TCP 的八位字节流性质,您第一次只能得到 's'。
-
你在用你的
uptr和length做奇怪的事情。在memcpy(中,您将当前循环计数器添加到您的目标地址。在循环之后,您将字符串长度加上参数计数。您复制 argv[3] 但添加 strlen(argv[3])-3? argv[1] 和 [2] 怎么样。没有测试 argv[3] 是否可用。 -
for( ; i < strlen(buffer); )无论您收到多少字节,这都会在第一个 \0 处停止。printf("%c", buffer[i],i);这是格式字符串和参数不匹配的问题。您的客户没有发送任何内容。