【问题标题】:Looping over a buffer received by a client program循环客户端程序接收到的缓冲区
【发布时间】:2019-03-03 08:05:18
【问题描述】:

C 编程新手在这里寻求一点帮助!我有一个缓冲区,其中包含客户端程序提供的一些数据,可以这样说:

pcity:阿姆斯特丹城市

我的问题是在服务器内部我想遍历这个循环并“弹出”我已经向客户端发送答案的命令和参数。在此示例中,假设在处理 pcityAmsterdam 部分后,我希望缓冲区变为 gcity。

这是我目前的代码:

while(sizeof(incbuf) > 0) 
    {
        if(incbuf[0] == 103) //get request
        {   
            puts("get req");
            memmove(incbuf, incbuf+1, strlen(incbuf));
            //puts(incbuf);
            key = strtok(incbuf, ":");
            //printf("%s\n",key);
            res = get(key);

            printf("%s\n",&res);
            if(res != NULL) //we got a match
            {
                puts("match");
                if(servbuf[0] == '\0')
                    servbuf[0] = 102;
                else
                    servbuf[strlen(servbuf)] = 102;
                strcat(servbuf, res);
                send(new_socket,servbuf,1024, 0);

            }
            else //not found
            {
                puts("not a match");
                if(servbuf[0] == '\0')
                    servbuf[0] = 110;
                else
                    servbuf[strlen(servbuf)] = 110;
                strcat(servbuf, &res);
                printf("BEFORE THE NOT FOUND: %s\n", servbuf);
                send(new_socket,servbuf,1024, 0);
            }
            memmove(incbuf, incbuf+strlen(key), strlen(incbuf));
            printf("%s\n", incbuf);
        }
        else if(incbuf[0] == 112) //put request
        {

            puts("put req");
            memmove(incbuf, incbuf+1, strlen(incbuf));


            char* keytoken  = strtok(incbuf, ":"); //get rid of the type
            printf("token: %s\n",keytoken );

            char* key       = malloc((strlen(keytoken)));
            char* value     = malloc((strlen(incbuf))); //Amsterdam--> key :city

            strcpy(key, keytoken);
            printf("key: %s\n",key );

            char* valuetoken = strtok(NULL, ": ");
            strcpy(value, valuetoken);
            printf("value: %s\n",value );
            put(key, value);

            memmove(incbuf, incbuf+strlen(key)+strlen(value)+1, strlen(incbuf));
            printf("AFTER MEMMOVE THIS IS THE BUF: %s\n", incbuf);

        }

此时我知道 strtok 会弄乱我的 incbuf 数组,但我需要它来标记数组。可能是这里的设计问题?

有什么建议吗?

【问题讨论】:

  • “命令”之间是否有某种分隔符?在您展示的示例中,pcity 命令(及其参数)和gcity 命令之间似乎有一个空格。根据您的协议规范,这个空间是强制性的吗?
  • 然后循环遍历缓冲区(你知道它的实际长度吗?)并将字符复制到另一个缓冲区中。当您点击命令终止符 (0) 时,您将拥有一个可以处理的完整命令。处理当前命令,然后在接收缓冲区上继续循环。
  • while(sizeof(incbuf) > 0) 应该做什么? sizeof(incbuf) 是一个永远不会改变的常数。

标签: c string parsing tokenize c-strings


【解决方案1】:

我设法通过一种解决方法来做到这一点。 (将 incbuf 复制到临时缓冲区就可以了,感谢您指出。)

while(strlen(incbuf) > 0) 
    {

        for (int i = 0; i < sizeof(incbuf); ++i)
            tmpbuf[i] = incbuf[i];


        if(incbuf[0] == 103) //get request
        {   
            memmove(tmpbuf, tmpbuf+1, strlen(tmpbuf));
            key = strtok(tmpbuf, " ");
            res = get(key);

            //printf("%p\n",(void*) &res);
            if(res != NULL) //we got a match
            {

                if(servbuf[0] == '\0')
                    servbuf[0] = 102;
                else
                    servbuf[strlen(servbuf)] = 102;
                strcat(servbuf, res);
                send(new_socket,servbuf,1024, 0);

            memset(servbuf, '\0', sizeof(servbuf));
            memmove(incbuf, incbuf+strlen(key), strlen(incbuf) - strlen(key));


            }
            else //not found
            {
                if(servbuf[0] == '\0')
                    servbuf[0] = 110;
                else
                    servbuf[strlen(servbuf)] = 110;
                strcat(servbuf, &res);
                send(new_socket,servbuf,1024, 0);
            }
            memset(servbuf, '\0', sizeof(servbuf));
            memmove(incbuf, incbuf+strlen(key)+2, strlen(incbuf) - strlen(key) +1);
            //memmove(incbuf, incbuf+strlen(key), strlen(incbuf));
        }
        else if(incbuf[0] == 112) //put request
        {

            memmove(tmpbuf, tmpbuf+1, strlen(tmpbuf));
            char* keytoken  = strtok(tmpbuf, ":"); //get rid of the type
            char* key       = malloc((strlen(keytoken)));
            char* value     = malloc((strlen(tmpbuf))); //Amsterdam--> key :city

            strcpy(key, keytoken);
            char* valuetoken = strtok(NULL, ": ");
            strcpy(value, valuetoken);
            put(key, value);

            memset(servbuf, '\0', sizeof(servbuf));
            memmove(incbuf, incbuf+strlen(key)+2 + strlen(value)+1, strlen(incbuf) - strlen(key) -strlen(value) +1);

        }
        else //immediate disconnection of the server in case of invalid requests
        {
            printf("ERROR\n");
            close(new_socket);
            exit(1);
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2019-11-25
    • 2019-07-08
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    相关资源
    最近更新 更多