繁体   English   中英

通过套接字从客户端到服务器传递结构

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM