LINUX.ORG.RU

Вопрос по работе с сокетами


0

1

Начинаю разбираться в написании сетевых приложений и возник вопрос. Например, есть два компьютера(далее передатчик и приемник) между которыми нужно передать асинхронно данные, простую строку или число. Нужно ли в коде передатчика в таком случае использовать функцию connect, а в приемнике listen? Если нет, то почему?

connect для UDP не нужен (это вспомогательная функция, которая просто запоминает параметры хоста:порта, куда надо отправлять данные)

demidrol ★★★★★ ()
Ответ на: комментарий от demidrol

а listen использовать? а как тогда после применения этой функции отправлять через этот же сокет данные в ответ, ведь после ее применения сокет в режиме прослушки остается?

SeredaOleg ()
Ответ на: комментарий от SeredaOleg

у тебя каша в голове. Гуглится же отличный туториал

и да, listen — это создание очереди, актуально только для tcp.

В UDP все просто: сервер создает сокет, вызывает bind() и дальше юзает recvfrom() для получения данных. Клиент вообще ничего не инициализует, а сразу же отправляет данные серверу с помощью sendto().

demidrol ★★★★★ ()
Ответ на: комментарий от nanoolinux

Спасибо разобрался, опробовал, все заработало! Возник следующий вопрос. А если есть 3 компьютера один должен принять от двух других данные все по тому же UDP. Как не потерять информацию, если я не знаю кто из них пошлет первым, а кто вторым, но при этом принять от обоих? Пусть они скажем присылают строки в которых указано кто из них первый, а кто второй.

SeredaOleg ()
Ответ на: комментарий от SeredaOleg

man recvfrom

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

...

The recvfrom() and recvmsg() calls are used to receive messages from a socket, and may be used to receive data on a socket whether or not it is connection-oriented.

If src_addr is not NULL, and the underlying protocol provides the source address, this source address is filled in. When src_addr is NULL, nothing is filled in;

nanoolinux ★★★★ ()
Ответ на: комментарий от SeredaOleg

Вопрос от том, как два раза вызвать recvfrom()? Или почему должна произойти потеря данных?

mky ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.