【问题标题】:Passing structure over a Socket from client to server通过 Socket 将结构从客户端传递到服务器
【发布时间】:2012-01-10 07:02:04
【问题描述】:

我需要编写将文件从客户端上传到服务器的代码。

在客户端,我已经声明了一个结构,

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));

这部分对客户端来说很好。在服务器端,如果我读取整个结构以及如何分隔文件内容和文件名?

另外,来自客户端的缓冲区值(即文件内容)是分配的,它是否可用于服务器端?

如何做到这一点?

提前致谢。

【问题讨论】:

    标签: c client-server structure


    【解决方案1】:

    传递一个带有指针的结构是没有用的。指针本身将被发送,但不是它们指向的东西。

    您需要做的是编组数据以进行传输,这是各种 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 类型的系统。但这基本上就是这样做的。

    【讨论】:

    • 在将数据序列化为outbuff的时候不是在页面上写p.name吗?
    • 我觉得outbuff += sizeof(int)需要在写完p.age之后加上。
    • 是的,两者都是正确的,我最初的年龄是最后一个,所以不需要它,但为了解决潜在的对齐问题而改变了它。现已修复,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多