Portál AbcLinuxu, 10. května 2025 05:30
no me to neripada ze by to postradalo smysl protoze prirazuju TCP spojeni k soketu a ne naopak
První sice v programu vytváříte socket, ale ze síťového hlediska socket jednoznačně určuje dané spojení, tedy socket je vytvořen pro dané spojení, ne naopak.
Co se týče požadavku na "znovupoužití" socketu tak mi to stejně jako ostatním zde přijde jako nesmysl (a stejně jako je by mě zajímalo, k čemu je to údajně potřeba...). Při práci se souborem se taky po provedení I/O operací nad souborem nesnažíte pro soubor aktuálně používaný filedescriptor znovu použít, aniž byste soubor předem zavřel. A zcela stejně se pracuje se sockety.
fd = open(...); dup2(fd, STDOUT_FILENO); close(fd);Stejně je tomu i se sockety, zavřete-li je pomocí
close()
, uvolní se tím handle (číslo) a případně se i ukončí spojení (byl-li ten handle poslední). Pokud byste ale mermomocí trval na tom, že po ukončení spojení chcete znovu použít stejný handle (stejné číslo) pro nové spojení, není nic jednoduššího (tedy nejde-li o multithreadovou aplikaci, která těch souborů nebo spojení otevírá průběžně spousty, pak by vám ho mohl mezitím jiný thread obsadit):
close(sd); int tsd = socket(); if (tsd != sd) { dup2(tsd, sd); close(tsd); } connect(sd, ...);
netcat -l -p 9999
'):
#include <stdlib.h> #include <unistd.h> #include <netinet/in.h> #include <netinet/tcp.h> #include <netdb.h> #include <iostream> int main() { struct addrinfo* info; struct addrinfo hint = { 0, PF_INET, SOCK_STREAM, SOL_TCP, 0, NULL, NULL, NULL }; getaddrinfo("localhost", "9999", &hint, &info); int sd = socket(info->ai_family, info->ai_socktype, info->ai_protocol); dup2(sd, STDERR_FILENO); close(sd); connect(STDERR_FILENO, info->ai_addr, info->ai_addrlen); std::cerr << "ahoj" << std::endl; return 0; }
Důležité upozornění: milé děti, výše uvedená ukázka je odstrašující příklad toho, jak se programovat nemá. Nechcete-li se smažit v pekle, důkladně ošetřete všechny návratové hodnoty a chybové stavy…
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.