【问题标题】:Linux C server standart socket reading problem with browser interaction浏览器交互的Linux C服务器标准套接字读取问题
【发布时间】:2021-04-03 12:11:46
【问题描述】:

下午好,stackoverflow。

我尝试根据标准方案制作一个简单的服务器:监听一个端口(listen),然后(accept),然后通过一个单独的进程通过一个带有通过(accept)接收的ID的套接字读取请求并发出对它的回应。

当我阅读 (recv) 时,一切正常。 但我决定提供较大的请求长度并同时进行解析。为此,我制作了一个函数(getsym)。 还有一个问题,不知为何,读完最后一段(长度为

我做了什么来解决这个问题: 0) 我将调试输出放在各处,因此我意识到在阅读请求的最后部分后一切都挂起。

  1. 有一个明显的解决方案——如果最后一部分的长度是
  2. 我试图使套接字非阻塞,然后立即发生错误 - 长度 = -1(错误)。显然这需要处理,但我没有这样做,因为我不知道如何确定请求的结束。
  3. 我检查了描述符是否未关闭,但所有内容都已关闭。

我怀疑问题所在的总数: -我怀疑问题出在读取调用中

如果有人告诉我该怎么做,我将非常感激。 +1000 的业力。

PS 那就是在单独的进程中读取请求的函数

void getsym_sub (int sockfd)
  {
  static char local_buf [HTTP_BUF_SIZE + 1] = {}; // Äëÿ áóôåðèçàöèè
  static int position = -1; // Ïîçèöèÿ -1 çíà÷èò åùå íè÷åãî íå ÷èòàëè
  static int length = 0;

  position++;
  if (position == length)
    {
      printf ("\n attempt \n");
      length = read (sockfd, &local_buf, HTTP_BUF_SIZE);
      printf ("\n %d \n", length);
      if (length < 0)
        {
        printf ("\n error occured \n");
        SYM = 0;
        return;
        }
      if (length == 0)
        {
        printf ("\n  endof occured \n");
        SYM = 0;
        return;
        }
      local_buf [length] = 0;
    }

  SYM = local_buf [position];
  return;
  }

【问题讨论】:

  • Please do not post images of code because they are hard to use. 代码应作为文本直接发布在您的问题中。
  • ` { position++; if (位置 == 长度) { printf ("\n 尝试 \n");长度 = 读取 (sockfd, &local_buf, HTTP_BUF_SIZE); printf ("\n %d \n", 长度); if (length
  • 代码应该在您的问题中,而不是在 cmets 中。请edit您的问题包含您的代码。
  • 好像忘了说它挂在printf ("\n attempt \n");和`` printf("\n %d \n", length);```
  • @AYAWARRIOR 取决于 HTTP 版本。阅读规格。

标签: c linux sockets server


【解决方案1】:

您似乎知道必须接收多少字节,因为如果客户端关闭连接,代码看起来会起作用。

如果您知道要跟随多少字节,则可以调整要读取的字节数,这样您就不会尝试读取超过客户端发送的字节数。因此,将长度作为尚未接收的字节数和实际缓冲区大小的最小值传递。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多