【发布时间】:2016-02-22 20:59:52
【问题描述】:
我正在编写一个简单的 HTTP 服务器,我需要解析传入的请求。
假设我读过类似下面的一行GET /file HTTP/1.1
我需要把它拆分成GET/file
我尝试了很多方法,但似乎都无法奏效。
问题是服务器在以下 while 循环中以块的形式读取传入的请求:
char echoBuffer[RCVBUFSIZE];
int recvMsgSize;
if ((recvMsgSize = recv(clntSocket, echoBuffer, RCVBUFSIZE, 0)) < 0)
DieWithError("recv() failed");
while (recvMsgSize > 0) {
if ((recvMsgSize = recv(clntSocket, echoBuffer, RCVBUFSIZE, 0)) < 0)
DieWithError("recv() failed");
}
我在循环中尝试了以下方法:
char *token;
for (i = 0; i < 3; i++){
switch (i) {
case 0:
token = strtok(echoBuffer, "/");
printf("%s\n", token[i]);
case 1:
token = strtok(echoBuffer, "HTTP");
printf("%s\n", token[i]);
}
}
但是所有这些打印都是GET 好几次。
我尝试定义一个字符串char *echoString 并使用strcat()
这只是一起失败,我希望因为缓冲区是一个字符数组。
那么我在这里有什么选择?
【问题讨论】:
-
是什么让您认为
strtok()可以用于由recv()填充的缓冲区?具体来说,您如何确保空终止? -
在使用任何类型的
str()函数之前,您是否建议将 char 数组转换为 char*?我不确定如何确保空终止,除非它成功拼接 GET -
见stackoverflow.com/q/33618837/10396,尽管名字不好,但密切相关。您需要将其分为两个步骤:1)接收整个请求; 2) 标记数据。
-
请注意,在这种情况下,接收整个请求意味着读取直到在输入流中找到
\r\n\r\n。 -
请勿将
strtok用于此目的(或任何实际目的),它会修改缓冲区并且不可重入
标签: c string char concat splice