C客户端/服务器程序:服务器不应该多次发送应答

时间:2013-04-01 17:53:27

标签: c network-programming

我在C中有以下场景:一个简单的客户端程序向服务器发送类似HTTP的请求,然后该服务器应该返回指定文件的输入。到目前为止,服务器应该只支持三种方法:GET,HEAD和错误请求的默认答案。

这是服务器程序的一部分:

for(;;){
    struct sockaddr_in clientAddr;
    int clientAddrLen = sizeof(clientAddr);
    int clientSocket;

    clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddr, &clientAddrLen);

    char buf[BUFSIZE];
    int bytesRecv;


    bytesRecv = recv(clientSocket, (char*)&buf, BUFSIZE, 0);
    while(bytesRecv > 0){
        char *method;
        method = strtok(buf, " ");
        printf("method %s\n", method);
        if(strncmp(method, head, 4) == 0){
            /*HEAD*/
            char answer[] = "method: HEAD\0";
            send(clientSocket, answer, sizeof(answer) + 1, 0);
        }else{
            if (strncmp(method, get, 3) == 0){
                /*GET*/
                char answer[] = "method: GET\0";
                send(clientSocket, answer, sizeof(answer) + 1, 0);
            }else{

                /*bad request*/
                char answer[] = "HTTP/1.1 400 Bad Request\0";
                send(clientSocket, answer, sizeof(answer) + 1, 0);
            }   
        }

        /*Read*/
        bytesRecv = recv(clientSocket, (char*)&buf, BUFSIZE, 0);
    }

这是客户端程序的一部分,它要求在命令行上输入请求,然后发送相应的输入:

char* server_reply[1024];
char* msg[100];

/*send requests*/
for(;;){
    printf("Request:\n");
    scanf("%s", &msg);

    if(strcmp(msg, "quit") == 0){
        break;
    }

    send(clientSocket, msg, sizeof(msg), 0);

    if(recv(clientSocket, server_reply, sizeof(server_reply), 0) < 0){
        printf("Failure in recv.");
    }else{
        printf("Server: %s\n", server_reply);
    }
}

现在,问题如下:当我在客户端输入例如“GET HEAD asd”时,我从服务器得到三个答案,即

  

方法:GET

     

方法:HEAD

     

HTTP / 1.1 400错误请求

当它实际应该只是“方法:GET”时。我真的不明白这个beaviour ...谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

scanf("%s", &msg);

读取字符串不是整行。这意味着当您输入GET HEAD asd时,您的循环运行三次。

首先它显示GET发送它 然后HEAD发送它 然后asd