【发布时间】:2023-03-11 22:10:01
【问题描述】:
我试图使用 tcp 套接字实现一种非常简单的 NFS 形式。除“ls”命令外,所有功能都正常工作。我的计划是使用链表结构来传递当前目录中的组成文件和目录名称列表。我写了以下代码:
struct lnode
{
char name[256];
struct lnode* next;
};
DIR* drptr = opendir("."); //as of now, only current directory is considered
if(drptr==NULL)
{
perror("Could not open");
}
else
{
struct dirent* drnt;
struct lnode* head = NULL,*tail = NULL;
drnt = readdir(drptr);
while(drnt!=NULL)
{
if(strcmp(drnt->d_name,".")!=0&&strcmp(drnt->d_name,"..")!=0)
{
if(head==NULL)
{
head = (struct lnode*)malloc(sizeof(struct lnode));
strcpy(head->name,drnt->d_name);
head->next = NULL;
teail = head;
}
else
{
tail->next = (struct lnode*)malloc(sizeof(struct lnode));
strcpy(tail->next->name,drnt->d_name);
tail->next->next = NULL;
tail = tail->next;
}
}
else
{
break;
}
drnt = readdir(drptr);
}
write(1,head,sizeof(lnode)); // the socket is duped to 1, so 1 is used for socket communication
}
在客户端我是这样阅读的:
struct lnode* l,*q;
recv(sfd,l,sizeof(struct lnode),0);
q = l;
while(q!=NULL)
{
printf("%s\n",q->name);
q = q->next;
}
在这里,我遇到了分段错误。经过一番思考,我了解到“下一个”指针指向服务器程序地址空间中的一个地址,因此客户端可以访问它。所以我使用了一个字符串数组来传递 d_name 列表,很明显,它工作得很好。
所以,我的问题是:
1.有没有办法通过套接字连接传递链表?
2。如果不是,那么通过网络传递组成文件和目录列表的最佳方法是什么?在真实 NFS 中是如何实现的?
【问题讨论】:
-
你需要序列化列表。你不能在套接字上传递一个指针,它是你内存中的一个地址。
-
您只是发送一个节点,而不是整个列表。
-
@Barmar,如何用 C 语言序列化列表?
-
为什么不看看真正的NFS是怎么做的呢?
-
它使用 XDR 进行数据表示,您可以使用 XDR 编码库。
标签: c sockets networking tcp nfs