gpt4 book ai didi

sockets - 远程文件内存映射

转载 作者:行者123 更新时间:2023-12-03 11:53:13 25 4
gpt4 key购买 nike

我被赋予了这个任务来实现一个 API 与下面的这些定义,它允许进程内存映射位于远程服务器上的文件的部分。我还需要实现一个客户端/服务器示例。

// Type definition for remote file location
struct fileloc {
struct in_addr ipaddress; // Remote IP
int port; // Remote port
char *pathname; // Remote file to be memory mapped
};
typedef struct fileloc fileloc_t;

// Create a new memory mapping in the virtual address space of the calling process
// location: Remote file to be memory mapped
void *rmmap(fileloc_t location, off_t offset);

// Deletes mapping for the specified address range
// addr: Address returned by mmap
int rmunmap(void *addr);

// Attempt to read up to count bytes from memory mapped area pointed
// to by addr + offset into buff
ssize_t mread(void *addr, off_t offset, void *buff, size_t count);

// Attempt to write up to count bytes to memory mapped area pointed
// to by addr + offset from buff
ssize_t mwrite(void *addr, off_t offset, void *buff, size_t count);

我面临一些设计挑战。这是我的想法:
  • 客户第一次调用rmmap() ,预定义服务器位置和请求的文件,以及偏移量。服务器将文件的固定 block 返回给客户端。
  • 服务器将记录哪个客户端请求了哪个文件 block 。它还将保留一个包含 ClientID、请求的偏移量和标志状态(锁定与否)的表。冲突处理引用此表。
  • 读取和写入功能将在客户端本地使用,并且与服务器没有连接。 (尽管我想知道是否可以在写入之前连接到服务器,这样客户端只能在没有人阅读时才能写入)。
  • unmap()将用于“提交”对服务器的更改。

  • 我仍然不确定锁定文件和解决冲突,但是我在正确的轨道上吗?

    最佳答案

    I'm still not sure on locking files and solving conflicts



    除了 API 之外,您还需要为传输定义一个协议(protocol),可能是内部协议(protocol)(即,在库中实现且对用户不透明,TCP 在内部实现的方式相对于 socket() )。客户端将需要保持持久连接并主动处理来自服务器的传入消息。这些消息将对应于其他连接的客户端进行的写入——即,它们是对 map 的更新。

    当客户端 A 向服务器发送写入时,如果客户端 B 刚刚写入该位置并且客户端 A 尚未确认接收到有关此的更新,则您将失败返回给客户端 A。

    您可以通过规定客户端无法写入尚未从服务器读取的位置来简化此操作,因此服务器只需向已读取文件任何部分的连接客户端发送更新。

    关于sockets - 远程文件内存映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24521269/

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