RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题

问题[сокет]

Martin Hope
dgopadakak
Asked: 2022-08-25 02:18:33 +0000 UTC

Guru Meditation 错误:提交字符串后 Core 1 出现恐慌(InstrFetchProhibited)

  • 0

我正在构建一个项目,其中一部分是 ESP32 上的套接字服务器。抛出此错误的场景如下:一个字符串到达​​套接字,{CHON}该字符串被成功处理,ESP32 打开必要的继电器并响应CHON,之后 Guru Meditation Error: Core 1 panic'ed (InstrFetchProhibited) 为抛出并且 ESP32 重新启动。请告诉我如何处理这个错误。
代码如下所示:

#include <WiFi.h>
#include <Wire.h>
 
 // Определяем максимальное количество клиентов, которые могут подключиться к этому серверу (обычно не более 4)
#define MAX_SRV_CLIENTS 5

 // Следующие три определения являются определениями отладки
#define DebugBegin(baud_rate)    Serial.begin(baud_rate)
#define DebugPrintln(message)    Serial.println(message)
#define DebugPrint(message)      Serial.print(message)
#define DebugPrintf(message)     Serial.printf(message)

int firstRelay = 5;
int secondRelay = 14;
 
const char* ssid = "Keenetic-6370";
const char* password = "vxTuT5JT";
 
 // Создаем номер порта сервера 80
WiFiServer server(80);
 // Управление клиентами
WiFiClient serverClients[MAX_SRV_CLIENTS];

long pushtime = 0;
 
void setup()
{
  pinMode(firstRelay, OUTPUT);
  digitalWrite(firstRelay, HIGH);
  pinMode(secondRelay, OUTPUT);
  digitalWrite(secondRelay, HIGH);
  
  DebugBegin(115200);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  DebugPrint("\nConnecting to "); 
  DebugPrintln(ssid);
  uint8_t i = 0;
  while (WiFi.status() != WL_CONNECTED && i++ < 30)
  {
    DebugPrint("."); 
    delay(500);
  }
  if (i == 21) 
  {
    DebugPrint("Could not connect to"); 
    DebugPrintln(ssid);
    while (1) 
    {
      delay(500);
    }
  }

  server.begin();   // Запускаем сервер
  server.setNoDelay(true);    // Отключаем функцию объединения небольших пакетов, без задержки при отправке данных
 
  DebugPrint("Ready! Use 'telnet ");
  DebugPrint(WiFi.localIP());
  DebugPrintln(" 80' to connect");
  pushtime = millis();
}
 
void loop()
{
  uint8_t i;
  if (server.hasClient())   // Определяем, поступает ли новый клиентский запрос
  {
    for (i = 0; i < MAX_SRV_CLIENTS; i++)   // Освобождаем старого недействительного или отключенного клиента
    {
      if (!serverClients[i] || !serverClients[i].connected())
      {
        if (serverClients[i])
        {
          serverClients[i].stop();
        }
        serverClients[i] = server.available();    // Назначаем последнего клиента
        DebugPrint("New client: "); 
        DebugPrintln(i);
        break;
      }
    }
    if (i == MAX_SRV_CLIENTS)   // Когда максимальное количество подключений достигнуто, подключение необходимо отклонить
    {
      WiFiClient serverClient = server.available();
      serverClient.stop();
      DebugPrintln("Connection rejected ");
    }
  }
 
  for (i = 0; i < MAX_SRV_CLIENTS; i++)   // Обнаружение данных, отправленных клиентом
  {
    if (serverClients[i] && serverClients[i].connected()) {
      if (serverClients[i].available())
      {
        String inString;
        while (serverClients[i].available())    //get data from the telnet client and push it to the UART
        {
          char inChar = serverClients[i].read();
          inString += inChar;
          delay(5);
          if (inChar == '}')
          {
            inString = "\n" + inString;
            if (inString.indexOf("{GLAVIARY}")>0)  // свет в навесе
            {
              digitalWrite(firstRelay, !digitalRead(firstRelay));
            }
            else if (inString.indexOf("{CHON}")>0)  // свет в домике куриц on
            {
              digitalWrite(secondRelay, LOW);
              for (i = 0; i < MAX_SRV_CLIENTS; i++)   // Отправляем данные каждому клиенту
              {
                if (serverClients[i] && serverClients[i].connected())
                {
                  serverClients[i].println("CHON");   // ПРЕДПОЛАГАЕМОЕ МЕСТО ОШИБКИ!!!
                  delay(5);
                }
              }
            }
            else
            {
              Serial.println("Wrong command");
            }
            inString = "";
          }
        }
      }
    }
  }
}

这是错误的样子: 这就是错误的样子

сеть сокет
  • 1 个回答
  • 34 Views
Martin Hope
mazik7512
Asked: 2022-08-23 05:22:08 +0000 UTC

python套接字中的值4096来自哪里

  • 2

在socket库中python有这样一个问题,数据检索函数的推荐值为recv4096字节。

我真的不明白这个值是如何证明的以及它来自哪里。关于此的文档非常谨慎地说:

注意:为了与硬件和网络现实进行最佳匹配,bufsize 的值应该是 2 的相对较小的幂,例如 4096。

而且看起来您应该深入研究硬件方面,但是例如MTU,以太网帧是1500字节,限制要TCP/UDP少一些2^16。

python сокет
  • 1 个回答
  • 55 Views
Martin Hope
Konstantin
Asked: 2022-08-17 17:47:37 +0000 UTC

发送和接收长客户端-服务器列表[关闭]

  • 0
关闭 这个问题是题外话。目前不接受回复。

该问题是由不再复制的问题或错字引起的。虽然类似的问题可能与本网站相关,但该问题的解决方案不太可能帮助未来的访问者。通常可以通过在发布问题之前编写和研究一个最小程序来重现问题来避免此类问题。

3 个月前关闭。

改进问题

有一个很长的清单。如何保证将其发送到服务器并取回?我已经尝试过对数据进行切片)对于客户端,使用变量 var = 8000,不会完整返回列表...

服务器代码:

import socketserver

class ThredingTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    pass

class EchoTCPHandler(socketserver.BaseRequestHandler):

    def handle(self):
        def recvall(request):
            BUFF_SIZE = 4096  # 4 KiB
            data = b''
            while True:
                part = request.recv(BUFF_SIZE)
                data += part
                if len(part) < BUFF_SIZE:
                    break
            return data

        full_data = recvall(self.request)
        print(f'Adress: {self.client_address[0]}')
        print(f'Data: {len(full_data)} {full_data}')
        # некая операция
        #d = eval(full_data)
        #d = d[::-1]

        msg = str(full_data).encode()
        self.request.sendall(msg)

if __name__ == '__main__':
    with ThredingTCPServer(('', 8888), EchoTCPHandler) as server:
        server.serve_forever()

客户端代码:

import socket


def recvall(sock):
    BUFF_SIZE = 4096 # 4 KiB
    data = b''
    while True:
        part = sock.recv(BUFF_SIZE)
        data += part
        if len(part) < BUFF_SIZE:
            break
    return data


var = 8000
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('127.0.0.1', 8888))
msg = str([i*i for i in range(var)]).encode()
sock.send(msg)
res = recvall(sock)
ans = res.decode()
print(len(ans), ans)
sock.close()
python сокет
  • 2 个回答
  • 67 Views
Martin Hope
Universall
Asked: 2022-07-19 04:15:25 +0000 UTC

异步套接字python如何异步等待写入/读取套接字的能力

  • 0

我玩socket。我有点想通了正常的版本,现在我想写一个异步的。例如一个简单的回显服务器。有一个代码:

    async def _run(self) -> None:
        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server_socket.bind((settings.HOST, settings.PORT))
        self.server_socket.listen(8)
        self.server_socket.setblocking(False)

        loop = asyncio.get_event_loop()

        while True:
            client, address = await loop.sock_accept(self.server_socket)
            print(f"Connected {address}")
            loop.create_task(self.handle_client(client, address))

    async def handle_client(self, client_socket: socket.socket, address: tuple) -> None:
        while True:
            data = client_socket.recv(1024).decode(encoding=settings.ENCODING)  # BlockingIOError: [WinError 10035] Операция на незаблокированном сокете не может быть завершена немедленно
            if not data:
                break
            client_socket.send(data.upper().encode(encoding=settings.ENCODING))
            print(data)

它因错误而中断:

BlockingIOError: [WinError 10035] Операция на незаблокированном сокете не может быть завершена немедленно

我大致理解为什么:需要self.server_socket.setblocking(False)实现异步并且客户端还没有读取过去的数据或者根本还没有准备好。client_socket.recv如果你把before time.sleep,那么一切都开始工作,但这显然不是一个解决方案。

我怎样才能异步(以便在那一刻处理其他客户端)等待我可以读/写东西的那一刻?

PS我知道asyncore,但我想从头开始写一切,并从内部了解一切是如何运作的

python сокет
  • 1 个回答
  • 67 Views
Martin Hope
Frop
Asked: 2022-07-28 20:14:20 +0000 UTC

localhost:8080 总是重定向到 ww.eclipse.org

  • 1

我使用 tcp/ip 监视器从 localhost:8080 监视 eclipse 站点(作为示例,了解 tcp/ip 的工作原理)。我删除了这台显示器,但没有停止它。现在 localhost:8080 总是将我重定向到 Eclipse 站点。我试图打开一个相同的监视器并关闭它,在同一个套接字 8080 上打开监视器,但使用不同的主机名(当我输入 localhost:8080 时,它会将我重定向到 eclipse 网站,而不是新的主机名),断开连接从互联网(地址仍然更改为www.eclipse.org,但该站点当然不可用),删除 eclipse - 没有任何作用。我试图在主机名为www.eclipse.org的套接字 9000 上打开另一个监视器,启动、停止,现在这个套接字也卡在这个站点上,但我没有删除这个监视器。

如何解决?

сокет
  • 1 个回答
  • 10 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5