我正在实现微型服务器,并且无法检测客户端请求。该要求要求我们只有在有两个连续的CRLF 的情况下才接受客户端的请求。所以我当前的代码是:
int bytes_read = recv(client, buffer, sizeof(buffer), 0);
if (bytes_read < 0) {
printfError("Problem with recv call", false);
}
if(checkRequest(buffer)) {
// Accept client's request
}
在我的 checkRequest 中,我将检查客户端的请求方法、文件名和 HTTP:
bool checkRequest(char *buff, int &valid, int &ext) {
char *request_method = strtok(buff, " ");
char *request_filename = strtok(NULL, " ");
char *request_http = strtok(NULL, " ");
int i;
bool isValid = false;
for(i = 0; i < 2; i++) {
if(*request_http == '\r') {
isValid = true;
*request_http++;
if(*request_http == '\n') {
// Keep checking
*request_http++;
} else {
isValid = false;
}
}
if(!isValid) break; // Not 2 consecutive CRLFs;
}
return isValid;
我在 telnet 上测试时遇到的问题是当我按下第一个 Enter 时;它只能检测到第一个 crlf。我也尝试在 while 循环之间使用recv(),但它会卡在其中。
最佳答案
虽然有更彻底和更强大的方法来实现这一点,但这是解决您的问题的简单方法。永远无法保证您将从发送方调用中收到多少字节,因此您必须不断调用 recv 直到获得所需的数据量。
const unsigned int kuiBytesExpected = 4;
unsigned int uiBytesReceived = 0;
while ( uiBytesReceived < kuiBytesExpected )
{
int bytes_read = recv(client, buffer + uiBytesReceived, kuiBytesExpected - uiBytesReceived, 0);
// recv returns 0 if client disonnects and -1 on error
if ( bytes_read < 1 )
{
printfError("Problem with recv call", false);
break;
}
else
{
uiBytesReceived += bytes_read;
}
}
if ( uiBytesReceived == kuiBytesExpected )
{
if(checkRequest(buffer))
{
// Accept client's request
}
}
关于c - Socket - 当有2个连续的crlf时接收客户端请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28312181/