Передача структуры через сокет от клиента к серверу - PullRequest
0 голосов
/ 10 января 2012

Мне нужно код для загрузки файла с клиента на сервер.

На стороне клиента я объявил структуру,

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

Эта часть подходит клиентской стороне.На стороне сервера, если я прочитал всю структуру и как мне отделить содержимое файла и имя файла?

Кроме того, значение буфера (то есть содержимое файла) со стороны клиента является неправильным и может ли оно быть доступным для серверасторона?

Как это сделать?

Заранее спасибо.

1 Ответ

3 голосов
/ 10 января 2012

Передавать структуру с указателями в ней бесполезно.Сами указатели будут отправляться через, но , а не на то, на что они указывают.

Что вам нужно сделать, это упорядочить данные для передачи, то, что различные механизмы 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 типы разных размеров.Но в основном так и делается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...