recvfrom - Как преобразовать буфер в строку - PullRequest
2 голосов
/ 30 августа 2010

В настоящее время я изучаю сетевое программирование на C / C ++ ... У меня есть опыт .NET, но не на C (особенно в сетевом программировании Unix)

Проблема, с которой я сейчас сталкиваюсьв том, что когда я получаю сообщение, мне нравится разбивать его на две части.Формат сообщения будет выглядеть как [command] filepath (например: get a.txt или put a.txt)

Я использую recvform для получения сообщения.

int recvfrom(int sockfd, void *buf, int len, unsigned int flags,
             struct sockaddr *from, int *fromlen);

Проблема в том, что я не знаю, как преобразовать "void * buff" в строку, чтобы я мог выполнить String.Split (""), чтобы получить команду и имя файла.

Может кто-нибудь объяснить, пожалуйста, как преобразовать "void * buff" в строку?

Ответы [ 3 ]

1 голос
/ 30 августа 2010

Вам понадобится символьный буфер и размер буфера. Как это:

char buf[1024];
const size_t buf_len = sizeof(buf);

Тогда вы можете вызвать recvfrom следующим образом:

ssize_t r;
r = recvfrom(sock, buf, buf_len-1, flags, &sock_from, &sock_from_len);
if(r<0) {
  handle_error(r);
} else if(r == 0) {
  handle_closed_socket(sock);
} else {
  buf[r] = '\0';
}

buf[r] = '\0'; гарантирует, что ваш буфер является правильной строкой C с нулевым символом в конце. Затем вы можете передать buf как строку.

1 голос
/ 30 августа 2010

Вы фактически передаете указатель на начало массива символов в качестве буфера.Системный вызов recvfrom() записывает в этот массив.Затем вы обрабатываете массив как символьную строку - после того, как убедитесь, что он правильно завершен нулем (чего не сделает recvfrom()).Конечно, отправляющая сторона должна поместить данные в совместимом формате, но recvfrom() даст вам то, что отправил вам отправитель.

Итак, прямой ответ: «Вы не конвертируетеvoid * в символьную строку; вы преобразуете символьную строку в void *, передавая ее в recvfrom() ".

0 голосов
/ 30 августа 2010

C не является C ++.Там нет строкового класса.Функция strtok может помочь вам получить то, что вы хотите, при условии, что вы обнуляете буфер вручную.

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