我正在尝试从服务器接收数据,第一次工作正常,但是随着read()的循环,它也会存储先前读取的旧值。以下是我目前的代码。
char receive[50];
if((he = gethostbyname(servername)) == NULL ) {
perror(strcat("Cannot find server named:", servername));
exit(0);
}
he = gethostbyname("localhost");
localIP = inet_ntoa(*(struct in_addr *)*he->h_addr_list);
client_sock_desc = socket(AF_INET, SOCK_STREAM, 0);
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(localIP);
server_addr.sin_port = htons(serverport);
len = sizeof(server_addr);
if(connect(client_sock_desc, (struct sockaddr *)&server_addr,len) == -1) {
perror("Client failed to connect");
exit(0);
}
strcpy(buf, "CLIENT/REQUEST\n");
send(client_sock_desc, buf, strlen(buf), 0);
//send actual function request
//put a space before \n char to make it easier for the server
for(i = 0; i < sizeof(wholeRequest); i++) {
if(wholeRequest[i] == '\n') {
wholeRequest[i] = ' ';
wholeRequest[i+1] = '\n';
break;
}
}
while(read(client_sock_desc, receive, sizeof(receive)) > 0) {
strcpy(receive, ""); //attempt to erase all old values
printf(receive);
fflush(stdout);
}
close(client_sock_desc);
当服务器发送数据并关闭套接字时,它可以正常工作。但是当我让客户端再次打开套接字,向服务器发送数据时,服务器会再次将数据发送到客户端并关闭套接字。客户端将再次尝试读取服务器发送的数据,但这次它会在接收中填充新信息和旧信息的一部分。
receive[0]='\0'
是清除字符串的好方法。因为在你打印输出之前,你已经“清除”了receive
,那么你怎么能得到任何输出呢?难道是因为你需要printf("%s", receive)
吗?我不确定当格式字符串为""
时printf
的反应如何... - Florisread()
时,它将填充一个空的receive
,只包含从服务器接收到的当前值。 - user2158382strcpy
行中“清除”了接收,在你上面的代码中,这发生在printf
之前。fflush
只是意味着printf
要输出到stdout
的所有内容实际上在执行下一行之前都会传输到控制台。那就是“刷新缓冲区”,而你正在对输出进行操作。 - Floris