c - Socket - 当有2个连续的crlf时接收客户端请求

标签 c sockets

我正在实现微型服务器,并且无法检测客户端请求。该要求要求我们只有在有两个连续的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/

相关文章:

c++ - 从 SYSTEMTIME 到 time_t 的转换给出 UTC/GMT 时间

java - 如何修复: Anylogic does not connect to Eclipse over Socket

javascript - Node.js 套接字被对方终止

c - 仅映射文件 C 的第一个字母

c - 如何制作外部开关控制LED stm32f4板?

c++ - 读取和写入 USACO 文件

c - 将 Knuth 随机数生成器集成到我的代码中

python - OpenCV 错误 : Assertion failed (size. 宽度>0 && size.height>0) python

java - 如何在邮件服务器上测试安全 SMTP 邮件服务

c - 从套接字 fd 获取 ip 地址(不重复)