c - 循环客户端程序接收到的缓冲区
问题描述
C编程新手在这里寻求一点帮助!我有一个缓冲区,其中包含客户端程序提供的一些数据,可以这样说:
pcity:阿姆斯特丹gcity
我的问题是在服务器内部我想遍历这个循环并“弹出”我已经向客户端发送答案的命令和参数。在此示例中,假设在处理 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 数组,但我需要它来标记数组。可能是这里的设计问题?
有什么建议么?
解决方案
我设法通过一种解决方法来做到这一点。(将 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);
}
}
推荐阅读
- sql - 使用函数找到最大 DEPTNO
- python - 在哪里保存降价文件,以便它显示在本地主机上
- node.js - 在传递给 ejs 模板的数组上运行 forEach
- java - 试图计算创建的对象数量
- mailkit - 使用 mailkit 时收到错误 4.4.5 来自主机的连接过多
- node.js - 为什么在 mac os 上无法通过 npm install 安装 dualshock 驱动程序?
- python - 可视化决策树时列表索引超出范围
- excel - 从复选框菜单自动生成PowerPoint演示文稿
- arrays - 从 UIButton 操作更改 uitextField placeHolder
- google-sheets - 使用 Google 表格查询中位数和分组依据和位置