我需要编写代码以将文件从客户端上传到服务器。
在客户端,我声明了一个结构,
typedef struct upload_file
{
char *filename;
char *filebuffer;
}upload_file;
我从命令行参数中获取文件名。
在 main 函数中,我用结构变量分配文件名。
upload_file.filename = argv[1];
然后我读取文件内容,将其放入缓冲区并将其复制到结构的缓冲区值。
strcpy(upld.buffer,tmp); //tmp is a buffer which will contain the file content
之后我将结构写入套接字如下,
write(sd, &upld, sizeof(upld));
这部分在客户端没问题。在服务器端,如果我读取整个结构以及如何分隔文件内容和文件名?
此外,来自客户端的缓冲区值(即文件内容)是分配的,它可以用于服务器端吗?
这个怎么办?
提前致谢。
最佳答案
传递一个带有指针的结构是没有用的。指针本身将被发送,但不是它们指向的东西。
您需要做的是整理要传输的数据,这是各种 RPC 机制(OPC、DCE 等)做得很好的事情。
如果您不能使用这样的既定方法,基本上就是逐个元素遍历结构,将目标复制到目标缓冲区中。
例如,结构:
struct person {
int age;
char *name;
char *addr;
} p;
你可以这样做:
msgbuff = outbuff = malloc (
sizeof (int) +
strlen (p.name) + 1 +
strlen (p.addr) + 1
);
if (msgbuff != NULL) {
*((int*)outbuff) = p.age; outbuf += sizeof (p.age);
strcpy (outbuff, p.name) ; outbuf += strlen (p.name) + 1;
strcpy (outbuff, p.addr) ; outbuf += strlen (p.addr) + 1;
// Send msgbuff
free (msgbuff);
} else {
// Some error condition.
}
请注意,int
是直接传输的,因为它在 结构中。对于字符指针(C 字符串),您必须获取指针的目标而不是指针本身。
本质上,您转换:
p: age (46)
name (0x11111111) --> 0x11111111: "paxdiablo"
addr (0x22222222) --> 0x22222222: "Circle 9, Hades"
|--------------------|-------------------------------|
structure memory <- | -> other memory
进入:
msgbuff (0x88888888) -> {age}{"paxdiablo"}{"Circle 9, Hades"}
这会使过程稍微复杂一些,因为您还必须在另一端解码,并且您需要注意具有不同大小的 int
类型的系统。但这基本上就是完成的方式。
关于c - 通过 Socket 将结构从客户端传递到服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8799694/