在我的套接字编程中,我将在循环中读取客户端用户的输入,直到用户输入空字符串,将其发送到服务器并让服务器搜索文本文件以查找与来自用户的输入。
我不知道客户端的循环有什么问题。它是一个while循环。它读入一次并给出适当的结果(甚至有一个小故障),但是当用户第二次输入时,它会挂起。它不会发送用户刚刚输入到服务器的内容。它只是挂起。 客户计划:
void error(char *msg)
{
perror(msg);
exit(0);
}
int main(int argc, char *argv[])
{
int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;
//char buffer[256];
if (argc < 1) {
fprintf(stderr,"usage %s hostname port\n", argv[0]);
exit(0);
}
char str1[300]= " ";
printf("Enter server port number: ");
scanf("%s", str1);
portno = atoi(str1);
//create a socket point
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
error("ERROR opening socket");
exit(1);
}
char str[300]= " ";
printf("Enter server host name: ");
scanf("%s", str);
server = gethostbyname(str);
if (server == NULL) {
fprintf(stderr,"ERROR, no such host\n");
exit(0);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
serv_addr.sin_port = htons(portno);
//now connect to server
if (connect(sockfd, (struct sockaddr*)&serv_addr,sizeof(serv_addr)) < 0)
{
error("ERROR connecting");
exit(1);
}
//NOW ASK FOR MESSAGE FROM USER, read by server
char buffer[256];
char buffer2[256];
do //**i believe problem starts here**
{
printf("Enter a college major: ");
bzero(buffer,256);
scanf("%s", buffer);
//send message to server
n = write(sockfd,buffer,strlen(buffer));
if (n < 0) {
error("ERROR writing to socket");
exit(1);
}
//now read server response
bzero(buffer,256);
n = read(sockfd,buffer,256);
if (n < 0)
{
error("ERROR reading from socket");
exit(1);
}
printf("%s\n",buffer);
} while(strcmp(buffer, " "));
return 0;
printf("Hello 1\n");
}
用户可能放置的输入(College major)可能有空格,所以“scanf(”%s“,buffer);”对那些人不起作用。这就是我所说的故障。如果有人输入“计算机科学”,则只将“计算机”发送到服务器。我在linux中编译这个,所以不允许获取(缓冲区)。我不知道该怎么办。还有一种方法可以将此do-while循环编写为while循环。我想在用户输入空字符串时终止程序。