c - 通过 Socket 将结构从客户端传递到服务器

标签 c client-server structure

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

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

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/

相关文章:

c++ - 如果结构作为递归函数中的参数传递,我如何初始化结构的成员变量?

关于不可移植项​​目的 C 标准未定义行为

c - C宏中参数的变量号

java - 如何让grpc客户端调用多个服务器?

c++ - 在结构中调用 lambda 函数

c - 动态分配数组结构的数组

c++ - 不应该发生的缓冲区溢出(?)

c - 循环不会运行多次

ios - 在 iOS 应用程序中选择退出 App Transport Security 功能

c++ - 编写一个简单的 C++ protobuf 流式客户端/服务器