Сокеты UDP в C

считайте возвраты/переводы строки каретки. Я верю в unicode, который они все еще 0x000D и 0x000A соответственно. тем путем можно быть столь эффективными или неэффективными, как Вы хотите и решаете, необходимо ли иметь дело с обоими символами или не

5
задан Trevor Hickey 11 April 2016 в 03:48
поделиться

3 ответа

accept используется только для сокетов, ориентированных на соединение (STREAM). UDP не является потоковым, ориентированным, поэтому нет соединений, и вы не можете использовать accept (2) - он вернет EOPNOTSUPP.

Вместо этого вы просто читаете пакеты непосредственно из связанного служебного сокета (обычно используя recvfrom (2) ), так что вы можете сказать, откуда пришел ваш, хотя вы можете использовать recv или просто прочитать, если вам все равно), после чего вы можете отправлять пакеты обратно, используя тот же сокет (и обычно используя sendto (2))

2
ответ дан 18 December 2019 в 06:02
поделиться

Чем UDP отличается от TCP:

  • ориентирован на сообщения, а не на потоки. Вы не читаете / не пишете и не отправляете / не получаете Вы отправляете / recvfrom. Размер сообщения ограничен 64 КБ. Каждый вызов recvfrom получает одно сообщение, отправленное вызовом sendto. Если recvfrom передает буфер, размер которого меньше размера сообщения, остальная часть сообщения удаляется навсегда.

  • нет соединений. Поэтому не слушать / принимать / подключаться. Вы отправляете сообщение на определенный адрес / порт. Когда вы получаете сообщение (на адрес / порт, к которому привязан ваш сокет), вы получаете источник входящего сообщения как выходной параметр recvfrom.

  • никаких гарантий. Сообщения могут быть сброшены или получены не по порядку. Однако, если я правильно помню, их нельзя усечь.

И последнее предостережение - вы можете заново изобретать TCP вместо UDP. В этом случае,

12
ответ дан 18 December 2019 в 06:02
поделиться

Имейте в виду, что UDP не требует установления соединения. Он только отправляет пакеты и не подходит для отправки файлов - если весь контент не помещается в один UDP-пакет.

Если вы все равно хотите отправлять / получать UDP-пакеты, вы просто вызываете sendto / ] recvfrom с соответствующими адресами.

1
ответ дан 18 December 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: