LINUX.ORG.RU

tcp-сокет пересылает данные на разные адреса без переподключения

 , ,


0

1

в общем есть примерно такой код:

int fd = socket(); <<----получили файловый дескриптор
/**/
connect(); <<----тут приконнектились к одному адресу, у меня это 127.0.0.1:1200
send();    <<----отправили что-то

fd = socket(); <<-----тут записали в fd уже другой дескриптор
/**/
connect(); <<-----тут приконнектились к другому адресу, теперь уже 127.0.0.1:1220 

send();    <<-----отправили что-то
ошибок то вроде возвращаяемых нет, но вопрос: нормально ли все сделано, или нужно было после первого send сделать close() сокета?

Ты перезаписал указатель. Первый сокет остался висеть в воздухе.

Radjah ★★★★★ ()

Если ресурс больше не нужен его нужно освбождать, то есть вызывать close().

mky ★★★★★ ()

Технически, в момент close() ОС закрывает соединение. Так что, по-хорошему, надо закрывать, особенно если программа собирается продолжать работать.

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

спасибо за ответы всем... другой вопрос: а можно ли для tcp-сокета использовать sendto?

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

а можно ли для tcp-сокета использовать sendto?

Нет, но ты можешь создать собственный протокол поверх udp и использовать sendto.

Nietzsche ()

Сокеты нужно закрывать - таблица файловых дескрипторов имеет свойство заканчиваться.

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

а можно ли для tcp-сокета использовать sendto?

Нет, но ты можешь создать собственный протокол поверх udp и использовать sendto.

А чей-та нельзя ? Очень даже можно :)


If sendto() is used on a connection-mode (SOCK_STREAM, SOCK_SEQPACKET) socket, the arguments dest_addr and addrlen are ignored (and the error EISCONN may be returned when they are not NULL and 0), and the error ENOTCONN is returned when the socket was not actually connected.


Другой вопрос - зачем ? Ведь поведение будет точно такое же как и у send() (если адрес назначения не указывать).

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

ну я имел ввиду такую функцию

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
               const struct sockaddr *dest_addr, socklen_t addrlen);

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

Я её тоже имел ввиду. Для TCP сокета dest_addr и addrlen должны быть NULL и 0 соответственно. Что есть по факту обычный send :)

joy4eg ★★★★★ ()

почему не нагуглить какую нибудь книгу по сети и не почитать ?

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

Действительно... И даже более того - sys_send реализован через sys_sendto

SYSCALL_DEFINE4(send, int, fd, void __user *, buff, size_t, len,
		unsigned int, flags)
{
	return sys_sendto(fd, buff, len, flags, NULL, 0);
}

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

А есть что посоветовать годного из литературы? Чтобы про юникс, сокеты (желательно не только AF_INET/AF_UNIX, а в целом тема рассматривалась глубоко)?

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

что может быть лучше исходников самой ос линукс ?

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

А есть что посоветовать годного из литературы?

Уже много лет TCP/IP Стивенса - все на сях, подробно разжевано, адаптированно как под линь так и под BSD

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

Для начала Beej's networking guide, дальше - Стивенс.

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

Для начала Beej's networking guide

Офигеть, кто-то эти статьи еще помнит... для опенсорса не все еще потеряно.

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