-6ren">
gpt4 book ai didi

ada - 如何使用 Ada 在套接字上正确读写?

转载 作者:行者123 更新时间:2023-12-04 18:08:08 24 4
gpt4 key购买 nike

基本上,我设法将多个客户端连接到单个服务器,但是从服务器读取时出现问题。我有两项任务(线程):一项用于阅读,一项用于写作。

  • 偏移量永远不会达到 0,从而导致无限循环。如何打印 "Incoming > "每次有来自服务器的新传入消息时?
  • 而且我不太确定缓冲区大小。我尝试了 1..1024 但在服务器发送 1024 个字符之前没有打印任何内容。
  • String'Write ada.streams.write 的快捷方式?

  • 写入数据
    String'Write(channel, "Hello client");
    --Where channel is Gnat.Sockets.Stream_Access type
    从服务器读取数据
        task body reader_task is    
    Offset : Streams.Stream_Element_Count;
    Buffer : Streams.Stream_Element_Array (1 .. 1);
    begin
    loop
    Text_IO.put_line("Incoming > ");
    loop
    Streams.Read (Channel.All, Buffer, Offset);
    exit when offset = 0;
    for I in Buffer'Range loop
    Text_IO.Put (Character'Val (Buffer (I)));
    end loop;
    end loop;
    end loop;
    end reader_task;

    最佳答案

    回答最后一个问题:String'Write用途 Ada.Streams.Write (更准确地说,因为 Ada.Streams.Write 在抽象类型上运行并且正在调度,它将调用为实际流类型编写的任何覆盖 Write)。但这不是速记。 Ada.Streams.Write接受 Stream_Element 的数组作为它的参数( Stream_Element 可能是一个字节)。但是String'Write需要一个 String ,它是一个字符数组,而不是一个流元素数组。实现处理 String作为流元素的数组并写入每个元素。实际上,它会写入每个字符,因此结果非常相似,但结构并不相同。诸如 Integer'Write 之类的东西将整数视为流元素数组并调用 Ada.Streams.Write在上面;没有定义实现是如何做到的。
    'Write也可以用于用户定义的类型。这是如何工作的默认规则,但您也可以编写自己的 'Write要使用的例程而不是默认值。 RM 13.13.2 解释了所有这些。

    (前两个问题似乎是关于 Read 是阻塞还是非阻塞 GNAT 套接字。我不知道答案。)

    关于ada - 如何使用 Ada 在套接字上正确读写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21577579/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com