[英]Passing structure over a Socket from client to server
我需要编码用于将文件从客户端上传到服务器。
在客户端,我已经声明了一个结构,
typedef struct upload_file
{
char *filename;
char *filebuffer;
}upload_file;
我从命令行参数获取文件名。
在主要功能中,我正在使用结构变量分配文件名。
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
类型的系统。 但这基本上就是完成的方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.