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

时间:2012-01-10 07:02:04

标签: 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

之后我将结构写入socket,如下所示,

 write(sd, &upld, sizeof(upld));

此部分适用于客户端。在服务器端,如果我阅读整个结构&我如何分离文件内容&文件名?

此外,来自客户端的缓冲区值(即文件内容)是malloced&可以在服务器端使用吗?

怎么做?

提前致谢。

1 个答案:

答案 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类型的系统。但这基本上就是这样做的。