我需要编码将文件从客户端上传到服务器。
在客户端,我已经声明了一个结构,
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
之后我将结构写入socket,如下所示,
write(sd, &upld, sizeof(upld));
此部分适用于客户端。在服务器端,如果我阅读整个结构&我如何分离文件内容&文件名?
此外,来自客户端的缓冲区值(即文件内容)是malloced&可以在服务器端使用吗?
怎么做?
提前致谢。
答案 0 :(得分:3)
传递带有指针的结构是没用的。指针本身将被发送,但不是他们指向的东西。
您需要做的是整理数据以进行传输,这是各种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
类型的系统。但这基本上就是这样做的。