Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Прием данных через интернет UDP сокет.  (Прочитано 1413 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Oopss

  • Автор темы
  • Любитель
  • *
  • Сообщений: 55
    • Просмотр профиля
Прием данных через интернет UDP сокет.
« : 08 Сентября 2010, 15:27:18 »
Здравствуйте!!!

Разбираюсь с интернет сокетами в Linux.
Пишу программку UDP сервер. Открывать UDP сокет и принимать данные научился.
Вот только не знаю как узнавать длину входящего пакета данных, IP и PORT источника (того кто отправил этот пакет).
Подскажите как это делается?

Спасибо.

Пользователь решил продолжить мысль 09 Сентября 2010, 18:13:00:
Разобрался:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>

#define SOCK_NAME "socket.soc"
#define BUF_SIZE 256

int main(int argc, char ** argv)
{
  struct sockaddr srvr_name, rcvr_name;
  char buf[BUF_SIZE];
  int   sock;
  int   namelen, bytes;

  sock = socket(AF_UNIX, SOCK_DGRAM, 0);
  if (sock < 0)
  {
    perror("socket failed");
    return EXIT_FAILURE;
  }
  srvr_name.sa_family = AF_UNIX;
  strcpy(srvr_name.sa_data, SOCK_NAME);
  if (bind(sock, &srvr_name, strlen(srvr_name.sa_data) +
        sizeof(srvr_name.sa_family)) < 0)
  {
    perror("bind failed");
    return EXIT_FAILURE;
  }
  bytes = recvfrom(sock, buf, sizeof(buf),  0, &rcvr_name, &namelen);
  if (bytes < 0)
  {
    perror("recvfrom failed");
    return EXIT_FAILURE;
  }
  buf[bytes] = 0;
  rcvr_name.sa_data[namelen] = 0;
  printf("Client sent: %s\n", buf);
  close(sock);
  unlink(SOCK_NAME);
}
 
« Последнее редактирование: 09 Сентября 2010, 18:13:00 от Oopss »

Оффлайн mkarasik

  • Участник
  • *
  • Сообщений: 163
    • Просмотр профиля
Re: Прием данных через интернет UDP сокет.
« Ответ #1 : 09 Сентября 2010, 21:54:27 »
Если хочешь узнать количество данных до ресива то нужно использовать ioctl с флагов FIONREAD. Для УДП вернет размер первой стоящей в очереди датаграммы. а на остальные вопросы сам ответил. :)

 

Страница сгенерирована за 0.016 секунд. Запросов: 21.